ブロッコリーを克服するまでプログラミング

プログラミングとか趣味とかを報告します。

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のほうが早そう。

 

f:id:atwtama:20180308001136p:plain