2013-07-31 70 views
2

是否有可能值向量在MS SQL Server的比較在SQL表中的所有列,更具體?比較所有列

例如,我有一個表,例如,3列:

EXAMPLE: ColA, ColB, ColC 

我要檢查,如果它的列匹配特定的載體:(「val0」,「VAL1」,「值2」 )

我知道我能做到這一點與這樣的句子:

SELECT * FROM EXAMPLE WHERE ColA='val0' AND ColB = 'val1' AND ColC = 'val2' 

但我想知道是否有一些功能,ALLEQUAL這可能讓我做這樣的事情:

SELECT * FROM EXAMPLE WHERE ALLEQUAL('val0', 'val1', 'val2'); 

我明白,如果該函數存在,它的語法在不同的RDBMS之間可能會有很大不同,現在我專注於Ms SQL Server。儘管如此,如果你可以給我其他數據庫管理員的例子,我會非常高興。

+0

你仍然要指定列名的設定/順序相匹配?在這種情況下,它不能比具有多個AND的查詢簡潔得多? –

+0

有些RDBMS允許你比較元組,但SQL Server不支持。 –

+0

馬丁,請你給我舉個例子嗎? –

回答

1
declare @Foo as Table (ColA Int, ColB Int); 
insert into @Foo (ColA, ColB) values (1, 1), (1, 2), (2, 1); 
select * from @Foo; 

select * 
    from @Foo 
    intersect 
    select * 
    from (values (2, 1)) as Bar(ColA, ColB); 
+0

'SELECT * FROM @Foo WHERE EXISTS(SELECT 2,1 INTERSECT SELECT ColA,ColB)'會更好,因爲它沒有暗示的'DISTINCT'相交,並且還允許返回Foo的附加列。 –

0

在精心設計的數據庫中的表將有一個主鍵,關鍵將是行的唯一標識符,因爲這是沒有必要的「載體」的其餘部分在方案相匹配。現在,如果你有一些扁平反規範化的數據

您可以創建生成動態SQL做你想做什麼的存儲過程。您必須查詢INFORMATION_SCHEMA.columns或sys.columns並生成與您編寫的第一條SQL語句類似的內容〜「WHERE ColA ='val0'AND ColB ='val1'AND ColC ='val2'」

varchar列唯一方法使用FOR XML PATH(「」)

BEGIN 
DECLARE @tbl TABLE(c1 VARCHAR(max), c2 VARCHAR(max), c3 VARCHAR(max)) 
DECLARE @vec TABLE(data VARCHAR(max)) 
INSERT INTO @tbl VALUES ('abc', '123', 'xyz'), ('cba', '321', 'zyx') 
INSERT INTO @vec VALUES ('abc'), ('123'), ('xyz') 
SELECT * FROM @tbl 
WHERE c1+c2+c3 = (SELECT '' + data FROM @vec FOR XML PATH('')) 
END 
+0

假設('val0','val1','val2')不是常數值,但選擇的結果。在某些情況下,如果子查詢的結果與所有列值匹配,您可能需要進行比較。 –

+0

@PabloFranciscoPérezHidalgo - 在這種情況下,你必須定義要比較這是一些ALLEQUAL(矢量)的功能非常不同的向量列。 ALLEQUAL應忽略主鍵和外鍵列嗎?什麼時間戳?在比較中應該忽略向量中的空值還是比較完全IS NULL? –

1

也許這將幫助你

SELECT * 
FROM EXAMPLE 
WHERE ColA+ColB+ColC = 'val0'+'val1'+'val2'