2012-04-18 7 views
7

を引っ張っ:フィールドがヌルの場合は、特定のフィールドをプルします。そうでない場合、私は次の表持つ他の分野

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 

任意のアイデア?

+0

あなたはどのデータベースを使用していますか? OracleとSQL Serverの両方のタグがあります。 –

答えて

15

使用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 Expressions (Oracle)

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 
1

もう一つの方法:

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

シェアをお楽しみください。

+0

注: 'NVL2()'は文字列パラメータをとります。これは暗黙的なキャストを意味し、必要に応じて元のデータ型に戻ってしまう可能性があります。 – MatBailie

+0

@Dems NVL2は、「LONG以外のすべてのデータ型」で動作します。http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions120.htm#i91806(ただし、列[A | 1 | 2 | 3 | 4]が異なるタイプの場合は、確かに問題が発生する可能性がありますが、ここでの回答に該当します) –

+0

@Dems:http://docs.oracle.com/cd/B28359_01にあるNVL2のドキュメント/server.111/b28286.pdf 2番目の引数が数値の場合、データベースは最も高い数値優先順位を持つ引数を判別し、そのタイプの値を返します。 2番目と3番目の引数でLONGが禁止されていることを除いて、どの型のパラメータも受け入れるという注意もあります。少なくともこれは11.1のように見えます。 YMMV。 –

関連する問題