SQLServer : ある列の値がすべて同じなのか、複数存在するのかを調べたい
タイトルの意味が分からないと思うけれど、例えば あるテーブルの [DATA_A] という列がほとんど「0」とする。このとき、もしかしたらある行に 「1」 が入ってるかもしれないし、もしかしたら全行が「0」かもしれない。 ある列に 複数の値が存在するのか、もしくはすべて同じ値なのかを調べたい。
という問題があったとき、まっさきに思いつくのは「GROUP BY (DISTINCT)」である。なので、以下のようなSELECTを考えた。
COUNT(t.DATA_A)が2以上となれば、1列に2種類の値が存在することになる。
*******************************************************************************
SELECT COUNT(t.DATA_A)
FROM
(SELECT DATA_A
FROM TESTDB
GROUP BY DATA_A ) t
********************************************************************************
しかし、本当にGROUP BYを使っていいのか。仮に、DATA_A列に「0」と「1」が存在するとき、適当に選んだ行の [DATA_A] の値をNOTでSELECTすればよいのではないか。
こちらについては、COUNT(DATA_A)が1以上となれば、1列に2種類以上の値が存在することになる。EXISTSとかも試してみたけど、一応これ。
********************************************************************************
SELECT COUNT(DATA_A)
FROM TESTDB
WHERE DATA_A <> (SELECT TOP 1 DATA_A FROM TESTDB)
********************************************************************************
実行プランは一応これ。
上が SELECT TOP 1、下が GROUP BY
特にプランがないのに適当に思いついた課題を取り上げたため、まとめられないけど、TOP 1のほうが早そう。