2012-01-10 65 views
2

我有一組行檢查數組是否值查詢的一個子集?

從用戶WHERE

SELECT ID ...

1 
2 
6 
8 
9 

的,我已經和陣列與價值2,3,6

我怎樣才能SQL查詢該數組是查詢結果的子集?

+0

可能[SQL選擇所有存在子集的行](http://stackoverflow.com/questions/8425232/sql-select-all-rows-where-subset-exists) – onedaywhen 2012-01-10 14:13:24

回答

2

SQL不支持這樣的支持數組,所以我不完全確定如何你正在存儲你的數組數組,並且這將影響回答這個問題的最佳方式。

這麼說,我應該這樣做:

SELECT u.id 
FROM Users U 
    RIGHT JOIN Numbers N 
     ON U.id=N.Number 
WHERE N.Number IN (2,3,6) 

這是基本的查詢;來自那裏的確切細節取決於你將如何檢測失敗。 u.ID爲NULL的任何記錄都表明它不是子集。如果不立即實際所需的一組ID的,你可以將它修改爲

SELECT COUNT(*) AS Missing 
FROM Users U 
    RIGHT JOIN Numbers N 
     ON U.id=N.Number 
WHERE N.Number IN (2,3,6) 
AND u.id IS NULL 

,並在任何缺少的是> 0,你就知道你沒有一個子集。 (在SQL Server中,至少可以將int轉換爲一點來獲得0 = false,如果應用程序更易於使用,則0 = true。)

其他詳細信息我們可以添加更多關於什麼的信息你實際上正在努力,但希望這是一個基本的技術是有道理的。

(NB這一切假設你已經在你的數據庫有一個數字/理貨表。他們是非常有用的話,如果你有沒有準備好,我會得到一個成立。)

1

使用Dynamic SQL

declare @cmd varchar(200) 
select @cmd = "select id from Users WHERE id in (" + @array + ")" 

exec(@cmd) 
+0

不,不是'IN'子句,您的查詢正在做另一種方式,使選定的ID將從數組限制。 – 2012-01-10 13:55:29

+0

你想檢查2,3,6是否都在表中?或者他們按照這個順序出現?究竟是什麼? – 2012-01-10 13:57:58

+0

如果你想檢查這個列表是否是一個確定的子集,那麼你還需要計算數組中元素的數量,並將其與此操作中返回集的長度進行比較。 – eftpotrm 2012-01-10 15:32:24

2

你必須逐個檢查每個記錄/項目,再算上他們。

如果JOIN的大小與數組大小相同,則該數組是該表的子集。

這裏是假設你的數組中的一個表的例子...

SELECT 
    COUNT(*) 
FROM 
    Users 
INNER JOIN 
    search 
    ON search.id = Users.id 
HAVING 
    COUNT(*) = (SELECT COUNT(*) FROM search) 
1

如果你能填充一個欄表格,你需要再次進行測試,那麼你可以做到這一點的值。

Select count(*) 
From 
    (
     Select id 
     From users 
     Intersect 
     Select id 
     From testValues 
    ) test 

如果count等於您正在測試的值的數量,則該數組將形成子集。

+0

當然這假定您正在使用帶相交的SQL變體。德姆的解決方案應該無處不在。 – 2012-01-10 14:10:48

相關問題