联合表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我不会这么说!我想在这种情况下每个人都会这么做。这样说吧,我“知道”你的意思。我同意你最后的说法。