联合表SQL的更快方法
我有一张桌子联合表SQL的更快方法,sql,postgresql,Sql,Postgresql,我有一张桌子 mode bank_id amount 'Outgoing' 1 100 'Incoming' 1 200 'Outgoing' 1 300 'Incoming' 2 200 我需要把它变成 from_bank_id to_bank_id amount 1
mode bank_id amount
'Outgoing' 1 100
'Incoming' 1 200
'Outgoing' 1 300
'Incoming' 2 200
我需要把它变成
from_bank_id to_bank_id amount
1 null 100
null 1 200
1 null 300
null 2 200
现在我正在这样做
SELECT
amount,
NULL AS from_bank_id,
bank_id AS to_bank_id
FROM TABLE_A WHERE mode = 'Incoming'
UNION ALL
SELECT
amount,
NULL AS to_bank_id,
bank_id AS from_bank_id
FROM TABLE_A WHERE mode = 'Outgoing'
这个sql可以工作并提供我想要的输出。只是想看看是否有更好的方法来实现这一点,而不必查询表两次
这是第二部分的第一部分查询
PostgreSQL的CASE
表达式允许以相同的行为省略ELSE NULL
(强调我的行为):
如果条件为true时为no,则CASE表达式的值是ELSE子句的结果如果省略ELSE子句且没有条件为true,则结果为null 括号也可以省略: 因此,查询可以在语法上简化为:
SELECT
CASE WHEN mode = 'Outgoing' THEN bank_id END AS from_bank_id,
CASE WHEN mode = 'Incoming' THEN bank_id END AS to_bank_id,
amount
FROM
table_a
…更具可读性
PostgreSQL的CASE
表达式允许以相同的行为省略ELSE NULL
(强调我的行为):
如果条件为true时为no,则CASE表达式的值是ELSE子句的结果如果省略ELSE子句且没有条件为true,则结果为null 括号也可以省略: 因此,查询可以在语法上简化为:
SELECT
CASE WHEN mode = 'Outgoing' THEN bank_id END AS from_bank_id,
CASE WHEN mode = 'Incoming' THEN bank_id END AS to_bank_id,
amount
FROM
table_a
…更具可读性。使用表达式可以更高效(更容易)地完成此操作
select
case
when mode = 'Outgoing' then bank_id
else null
end as from_bank_id
,case
when mode = 'Incoming' then bank_id
else null
end as to_bank_id
,amount
from
TABLE_A
使用表达式可以更高效(更容易)地完成此操作
select
case
when mode = 'Outgoing' then bank_id
else null
end as from_bank_id
,case
when mode = 'Incoming' then bank_id
else null
end as to_bank_id
,amount
from
TABLE_A
请注意,使用
UNION
进行此操作并没有本质上的错误,实际上,UNION ALL
将更快,并允许立即返回结果(而不是在返回之前缓冲所有结果)。请注意,使用UNION
进行此操作并没有本质上的错误,实际上,UNION ALL
将更快,并允许立即返回结果(而不是在返回之前缓冲所有结果)。谢谢!我知道我可以利用这个案例。谢谢你讲清楚了!还有,这比我现在做的快很多吗?我想知道如何比较sql语句:)这仅仅是运行了多少个查询吗?@Zanko纯粹从代码上无法确定一种方法是否比另一种方法快。您需要自己对代码进行基准测试/评测。它还取决于索引、数据在磁盘上的物理排列方式、DBMS缓存等。您可以从查看执行计划开始(EXPLAIN
:)它可以作为well@dai,如果索引在“mode”上,mode=“something”使用索引时是否使用CASE?@Zanko我不会这么说!我想在这种情况下每个人都会这么做。这样说吧,我“知道”你的意思。我同意你最后的说法,谢谢!我知道我可以利用这个案例。谢谢你讲清楚了!还有,这比我现在做的快很多吗?我想知道如何比较sql语句:)这仅仅是运行了多少个查询吗?@Zanko纯粹从代码上无法确定一种方法是否比另一种方法快。您需要自己对代码进行基准测试/评测。它还取决于索引、数据在磁盘上的物理排列方式、DBMS缓存等。您可以从查看执行计划开始(EXPLAIN
:)它可以作为well@dai,如果索引在“mode”上,mode=“something”使用索引时是否使用CASE?@Zanko我不会这么说!我想在这种情况下每个人都会这么做。这样说吧,我“知道”你的意思。我同意你最后的说法。