如何将 TRIM 的结果与 table 中的列匹配以进行 JOIN
How to match results of TRIM to column in table for a JOIN
进一步查看原始问题和代码。这是有效的代码:
SELECT v1.s_owner_guid,
n.node_name as s_owner_name
FROM vm_list v
CROSS JOIN LATERAL (
SELECT (VALUES (TRIM(split_part(v2.set_of_guids, ':', 3), '|')))
) v1(s_owner_guid)
LEFT JOIN nodes n
ON n.id = v1.s_owner_guid::uuid
原代码无效:
SELECT
(TRIM (split_part(v2.set_of_guids, ':', 3)), '|') AS s_owner_guid
, n1.node_name as s_owner_name
FROM vm_list as v2
INNER JOIN nodes
AS n1
ON n1.id=s_owner_guid
我想从这个 SELECT
中得到 s_owner_guid 和 s_owner_name
这是我遇到问题的查询的一部分,是嵌套的 SELECT
The error I get is:
ERROR: column "s_owner_guid" does not exist
LINE 7: ON v2.owner=s_owner_guid
我有一个 set_of_guids 包含由特定字符分隔的 2 个节点 uid
我有 2 table 有我需要的信息
vm_list
节点是 2 tables
vm_owner_guid
是 vm_list table 中的一列,它在节点 table 中具有匹配 id 列的 uid
id
是节点中的一列 table
vm_name
是 vm_list 中的一列,VM 名称为
node_name
是节点中的一列,它与节点 table 中的 id 列关联
- set_of_guids 中的第一个 uid 匹配 vm_owner 以及节点 table 中的 id 列,并且在节点 [=] 的另一列中有一个 node_name 48=]
我需要解析 set_of_nodes 以获得 VM 的第二个 uid,所以我使用 SPLIT_PART 和 TRIM 选项来隔离 uid 并调用它 s_owner_guid
我需要获取 s_owner_guid 并将其与节点 table 中的 id 进行匹配以获得第二个 node_name
最终输出将如下所示:
vm_name | p_owner_guid | p_owner_name | s_owner_guid | s_owner_name
-------------+---------------------------------------+-------------------+---------------------------------------+-----------------------
NAMEOFVM1 | b2a0bb4e-0a6a-4208-8ff1-6df549cf9c3f | primary_node_name | 1c732242-56d4-c9c8-d275-ba271600c314 | secondary_node_name
我现在可以获取前 4 个字段,但不能获取最后一个 s_owner_name。有什么办法可以做到这一点?由于有一个依赖于数据库的实时系统,我试图不创建临时 table。
您不能在引入它的同一级别上使用列别名。您需要将查询包装在派生的 table:
SELECT v2.s_owner_guid,
n1.node_name as s_owner_name
FROM (
select trim(split_part(v2.set_of_guids, ':', 3)), '|') AS s_owner_guid
FROM vm_list
) as v2
JOIN nodes AS n1 ON n1.id = s_owner_guid
Postgres 支持横向连接,这是实现此目的的好方法:
SELECT v.s_owner_guid,
n.node_name as s_owner_name
FROM vm_list v2 CROSS JOIN LATERAL
(VALUES (TRIM(split_part(v2.set_of_guids, ':', 3), '|')))
) v(s_owner_guid)
nodes n
ON n.id = v.s_owner_guid;
横向连接允许您在 FROM
子句中定义列——然后它可以用在 SELECT
、FROM
或 [=14= 中的表达式中],就像任何其他专栏一样。
进一步查看原始问题和代码。这是有效的代码:
SELECT v1.s_owner_guid,
n.node_name as s_owner_name
FROM vm_list v
CROSS JOIN LATERAL (
SELECT (VALUES (TRIM(split_part(v2.set_of_guids, ':', 3), '|')))
) v1(s_owner_guid)
LEFT JOIN nodes n
ON n.id = v1.s_owner_guid::uuid
原代码无效:
SELECT
(TRIM (split_part(v2.set_of_guids, ':', 3)), '|') AS s_owner_guid
, n1.node_name as s_owner_name
FROM vm_list as v2
INNER JOIN nodes
AS n1
ON n1.id=s_owner_guid
我想从这个 SELECT
中得到 s_owner_guid 和 s_owner_name这是我遇到问题的查询的一部分,是嵌套的 SELECT
The error I get is:
ERROR: column "s_owner_guid" does not exist
LINE 7: ON v2.owner=s_owner_guid
我有一个 set_of_guids 包含由特定字符分隔的 2 个节点 uid
我有 2 table 有我需要的信息
vm_list
节点是 2 tablesvm_owner_guid
是 vm_list table 中的一列,它在节点 table 中具有匹配 id 列的 uid
id
是节点中的一列 tablevm_name
是 vm_list 中的一列,VM 名称为node_name
是节点中的一列,它与节点 table 中的 id 列关联
- set_of_guids 中的第一个 uid 匹配 vm_owner 以及节点 table 中的 id 列,并且在节点 [=] 的另一列中有一个 node_name 48=]
我需要解析 set_of_nodes 以获得 VM 的第二个 uid,所以我使用 SPLIT_PART 和 TRIM 选项来隔离 uid 并调用它 s_owner_guid
我需要获取 s_owner_guid 并将其与节点 table 中的 id 进行匹配以获得第二个 node_name
最终输出将如下所示:
vm_name | p_owner_guid | p_owner_name | s_owner_guid | s_owner_name
-------------+---------------------------------------+-------------------+---------------------------------------+-----------------------
NAMEOFVM1 | b2a0bb4e-0a6a-4208-8ff1-6df549cf9c3f | primary_node_name | 1c732242-56d4-c9c8-d275-ba271600c314 | secondary_node_name
我现在可以获取前 4 个字段,但不能获取最后一个 s_owner_name。有什么办法可以做到这一点?由于有一个依赖于数据库的实时系统,我试图不创建临时 table。
您不能在引入它的同一级别上使用列别名。您需要将查询包装在派生的 table:
SELECT v2.s_owner_guid,
n1.node_name as s_owner_name
FROM (
select trim(split_part(v2.set_of_guids, ':', 3)), '|') AS s_owner_guid
FROM vm_list
) as v2
JOIN nodes AS n1 ON n1.id = s_owner_guid
Postgres 支持横向连接,这是实现此目的的好方法:
SELECT v.s_owner_guid,
n.node_name as s_owner_name
FROM vm_list v2 CROSS JOIN LATERAL
(VALUES (TRIM(split_part(v2.set_of_guids, ':', 3), '|')))
) v(s_owner_guid)
nodes n
ON n.id = v.s_owner_guid;
横向连接允许您在 FROM
子句中定义列——然后它可以用在 SELECT
、FROM
或 [=14= 中的表达式中],就像任何其他专栏一样。