Sql 如果字段为空,则拉取某些字段;否则,拉其他字段

Sql 如果字段为空,则拉取某些字段;否则,拉其他字段,sql,sql-server,oracle,Sql,Sql Server,Oracle,我有下表: TestTable ColumnA Column1 Column2 Column3 Column4 我想编写一个简单的SQL语句来检查ColumnA,并根据它是否为null返回某些列 类似于(伪): 有什么想法吗?使用SQL CASE表达式: SELECT ColumnA, CASE WHEN ColumnA IS NULL THEN Column1 ELSE Column3 END AS ColumnB, CASE

我有下表:

TestTable  
  ColumnA  
  Column1  
  Column2  
  Column3  
  Column4 
我想编写一个简单的SQL语句来检查ColumnA,并根据它是否为null返回某些列

类似于(伪):


有什么想法吗?

使用SQL CASE表达式:

SELECT
    ColumnA,
    CASE WHEN ColumnA IS NULL THEN Column1 ELSE Column3 END AS ColumnB,
    CASE WHEN ColumnA IS NULL THEN Column2 ELSE Column4 END AS ColumnC
FROM
    TestTable
请参阅:


我能想到几条路线,没有一条一定漂亮

人们通常先找到第一个,然后再寻找更好的。我不确定是否真的有更好的

SELECT
  ColumnA,
  CASE WHEN ColumnA IS NULL THEN Column1 ELSE Column2 END AS ColumnB,
  CASE WHEN ColumnA IS NULL THEN Column3 ELSE Column4 END AS ColumnC
FROM
  yourTable
或者

或者


还有一种方法可以剥下这只猫的皮:

SELECT ColumnA,
       NVL2(ColumnA, Column3, Column1),
       NVL2(ColumnA, Column4, Column2)
  FROM TestTable

共享和享受。

注意:
NVL2()
接受字符串参数,这意味着隐式转换,然后根据需要可能返回到本机数据类型。@Dems
NVL2
适用于“除LONG以外的任何数据类型”:(尽管if列[A | 1 | 2 | 3 | 4]如果是不同的类型,那么肯定会有问题,但这里的任何答案都是如此。)@Dems:根据NVL2的文档,似乎如果第二个参数是数字,数据库将确定哪个参数具有最高的数字优先级,并返回该类型的值。还需要注意的是,它将接受任何类型的参数,除了第二个和第三个参数禁止使用LONG。至少在第11.1条中是这样。你在用什么数据库?您同时具有Oracle和SQL Server标记。
SELECT
  yourTable.ColumnA,
  subTable.ColumnB,
  subTable.ColumnC
FROM
  yourTable
CROSS APPLY
(
  SELECT yourTable.Column1 AS ColumnB, yourTable.Column3 AS ColumnC WHERE yourTable.ColumnA IS NULL
  UNION ALL
  SELECT yourTable.Column2 AS ColumnB, yourTable.Column4 AS ColumnC WHERE yourTable.ColumnA IS NOT NULL
)
  AS subTable
SELECT
  ColumnA,
  Column1 AS ColumnB,
  Column2 AS ColumnC
FROM
  yourTable
WHERE
  ColumnA IS NULL

UNION ALL

SELECT
  ColumnA,
  Column2 AS ColumnB,
  Column4 AS ColumnC
FROM
  yourTable
WHERE
  ColumnA IS NOT NULL
SELECT ColumnA,
       NVL2(ColumnA, Column3, Column1),
       NVL2(ColumnA, Column4, Column2)
  FROM TestTable