1. ホーム
  2. sql

[解決済み] BITフィールドにMIN集計関数を適用する。

2023-02-01 09:26:37

質問

以下のようなクエリを書きたいのですが、どうすればいいですか?

SELECT   ..., MIN(SomeBitField), ...
FROM     ...
WHERE    ...
GROUP BY ...

問題なのは ビットフィールドの最小値を計算したい場合、SQL Server はそれを好まない。 というエラーが返されることです。 Operand data type bit is invalid for min operator .

次のような回避策を使うことができますね。

SELECT   ..., CAST(MIN(CAST(SomeBitField AS INT)) AS BIT), ...
FROM     ...
WHERE    ...
GROUP BY ...

しかし、もっとエレガントなものはないのでしょうか? (たとえば、私が知らないだけで、論理的な and を評価するような関数があるかもしれません)。

どのように解決するのですか?

の選択肢は2つしかないので BIT には2つの選択肢しかないので、caseステートメントを使うだけです。

SELECT CASE WHEN EXISTS (SELECT 1 FROM ....) THEN 1 ELSE 0 END AS 'MinBit'
FROM ...
WHERE ...

という利点があります。

  • テーブルスキャンを強制しない (インデックスが BIT フィールドのインデックスはほとんど使用されない)
  • ショートサーキット 2回 (1回は EXISTS に対してもう一度、そして CASE )

書くべきコードが少し増えますが、ひどいことにはならないでしょう。 複数の値をチェックする場合は、より大きな結果セット (すべての JOINFILTER の基準)を CTE をクエリの最初に置き、それを CASE ステートメントで参照します。