10

次の表があります。

TestTable  
  ColumnA  
  Column1  
  Column2  
  Column3  
  Column4 

ColumnA をチェックし、それが null であるかどうかに応じて特定の列を返す単純な SQL ステートメントを作成したいと考えています。

(疑似)のようなもの:

If ColumnA Is Null
  SELECT ColumnA, Column1, Column2 
  FROM TestTable
Else
  SELECT ColumnA, Column3, Column4
  FROM TestTable

何か案は?

4

3 に答える 3

17

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

参照:
CASE (SQL-Server Transact-SQL)
CASE 式 (Oracle)

于 2012-04-18T17:24:08.637 に答える
3

この特定の猫の皮を剥ぐもう1つの方法:

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

共有してお楽しみください。

于 2012-04-18T17:39:24.823 に答える
3

いくつかのルートを考えることができますが、どれも必ずしもきれいではありません...

多くの場合、最初のものを見つけてから、より良いものを探します。本当に良いものがあるかどうかはわかりません。

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
  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
于 2012-04-18T17:25:34.653 に答える