2017-09-20 85 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) 

我當然可以通過創建一個巨大的「和」鏈做到這一點。但是在我想執行這個查詢的環境中,我必須比較多達7個值,因此AND鏈會很龐大(現在重組表並不是一個選項)。

有沒有優雅的方式來做到這一點?

+0

您可以創建一個函數,以便在其他地方移除AND鏈。 –

+0

爲了節省巨大的7列鏈,您將不得不使用動態sql,在這裏您將查詢表的列,並構建where條件。 –

+0

會有6個比較,我不會稱之爲巨大的。 –

回答

0

您可以構建一個自定義表達式,但它不會簡化很多事情。例如:

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

在這裏,你可以嘗試一下:

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標準溶液比較。

0

如果你想使用1表達式,你可以嘗試下面的方法。但我認爲它不如使用單獨的比較(Value1 = Value2 AND Value1 = Value3 AND 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) 
相關問題