5

たくさんの列を持つテーブルがあります。列があるとします

あいうえお

これらの各列では、1 つのレコードの 1 つの列のみが入力され、他の列は常に NULL になります。

null 以外の列の列を返す select ステートメントが必要です。

合体を試みましたが、これは値が属する列ではなく、値を返します。

これを行う最も簡単な方法を知っている人はいますか?

4

5 に答える 5

8
SELECT
    CASE
        WHEN A IS NOT NULL THEN 'A'
        WHEN B IS NOT NULL THEN 'B'
        WHEN C IS NOT NULL THEN 'C'
        WHEN D IS NOT NULL THEN 'D'
    END
FROM
    MyTable
于 2009-08-26T10:07:07.103 に答える
4

ケースを試す...

SELECT
CASE WHEN A IS NOT NULL THEN 'A' WHEN B IS NOT NULL THEN 'B' WHEN C IS NOT NULL THEN 'C' WHEN D IS NOT NULL THEN 'D' END as NotNullCol, OtherCols
FROM YourTable
于 2009-08-26T10:08:35.010 に答える
3

複数列のセットを使用しようとしている場合は、スキーマが間違っている可能性があります。

A、B、C、および D を別のテーブルの別の行に分離し、それらを元のテーブルの行に結び付けて、JOINタイプのクエリを作成する方がほぼ確実に簡単です。

または、NULL 以外の列が 1 つだけの場合は、型 (A、B、C、または D) と値の 2 つの列を選択します。そうすれば、すべての行で列を無駄にすることはなく、クエリは計り知れないほど簡単になります (型が同じであると仮定します)。

ただし、次の方法でこれを行うことができcaseます。

select case
    when A is not null then 'A'
    when B is not null then 'B'
    when C is not null then 'C'
    else                    'D'
    end
from ...

構文が正確ではない可能性があるため、調べる必要があります。Iそれは悪い考えだと思うので、私が通常行うことではありません (select の行ごとの関数はうまくスケーリングされません)。

于 2009-08-26T10:13:24.940 に答える
2

きれいではありませんが、これはあなたが望むことをします:

select case 
    when a is not null then 'a' 
    when b is not null then 'b' 
    when c is not null then 'c' 
    when d is not null then 'd' 
end
于 2009-08-26T10:09:59.733 に答える