2017-09-20 6 views
0

私はこのような「ALL_EQUAL」機能を探しています:SQL Server:指定されたすべての値が等しいかどうかを判断する関数はありますか?

SELECT * 
FROM Table1 
INNER JOIN Table2 ON Table2.Field = Table1.Field 
INNER JOIN Table3.Field = Table1.Field 
WHERE ALL_EQUAL(Table1.Value, Table2.Value, Table3.Value) 

私は確かに巨大な「AND」チェーンを作成することによってこれを行うことができます。しかし、私はこのクエリを実行したい環境では、最大7つの値を比較する必要があるので、ANDチェーンは大規模になります(テーブルの再構成はオプションではありません)。

これを行ううれしい方法はありますか?

+0

ANDの連鎖が別の場所で削除されるように関数を作成できます。 –

+0

7列のHUGEチェーンを節約するには、動的SQLを使用する必要があります。ここで、テーブルの列を照会し、where条件を作成します。 –

+0

6つの比較がありますが、私はこれを大規模とは言いません。 –

答えて

0

カスタム式を作成することはできますが、単純化することはありません。たとえば:

DECLARE @Value1 TINYINT = 5 
     ,@Value2 TINYINT = 5 
     ,@Value3 TINYINT = 5 
     ,@Value4 TINYINT = 3; 

SELECT IIF(CONCAT(@Value1, @Value2, @Value3, @Value4) = REPLICATE(@Value1, 4), 1, 0) 

GO 

DECLARE @Value1 TINYINT = 5 
     ,@Value2 TINYINT = 5 
     ,@Value3 TINYINT = 5 
     ,@Value4 TINYINT = 5; 

SELECT IIF(CONCAT(@Value1, @Value2, @Value3, @Value4) = REPLICATE(@Value1, 4), 1, 0) 

GO 


DECLARE @Value1 TINYINT = 5 
     ,@Value2 TINYINT = NULL 
     ,@Value3 TINYINT = 5 
     ,@Value4 TINYINT = 5; 

SELECT IIF(CONCAT(@Value1, @Value2, @Value3, @Value4) = REPLICATE(@Value1, 4), 1, 0) 

GO 



DECLARE @Value1 VARCHAR(8) = 5 
     ,@Value2 TINYINT = 5 
     ,@Value3 TINYINT = 5 
     ,@Value4 TINYINT = 5; 

SELECT IIF(CONCAT(@Value1, @Value2, @Value3, @Value4) = REPLICATE(@Value1, 4), 1, 0) 

GO 

これは少し長さを減らすことができるが、それはANDを使用して標準溶液との比較のパフォーマンスに影響を及ぼしている、どのようにテストする必要があります。ここでは

CONCAT(@Value1, @Value2, @Value3, @Value4) = REPLICATE(@Value1, 4) 

は、あなたはそれを試すことができます。

0

1つの式を使用する場合は、以下の方法を試してみてください。しかし、私はそれが別の比較(Value1 = Value2とValue1 = Value3とValue1 = Value4 ...)を使用するよりも良いとは思わない。 7つの値がある場合、それは6つの比較です。

SELECT * 
FROM Table1 
INNER JOIN Table2 ON Table2.Field = Table1.Field 
INNER JOIN Table3.Field = Table1.Field 
WHERE Table1.Value = ALL(
     SELECT Table2.Value UNION ALL 
     SELECT Table3.Value) 
関連する問題