2011-07-15 84 views
2

我需要檢查一個(或多個)多個值是否存在於SQL數組中。 在其最簡單的形式,它會是這個樣子:檢查SQL數組中的多個值

SELECT 
    (1, 7, 8) IN (1, 2, 3, 4, 5) 
FROM DUAL 

顯然這種說法是行不通的。它只適用於檢查數組中的一個值。但是我需要知道我提供的值中有一個(不是全部!)是否存在於SQL數組中。如果數組中存在一個或多個值,則語句應該返回TRUE;如果沒有,則返回FALSE。

我知道我可以只是添加若干檢查,例如:然而

SELECT 
    1 IN (1, 2, 3, 4, 5) 
OR 7 IN (1, 2, 3, 4, 5) 
OR 8 IN (1, 2, 3, 4, 5) 
FROM DUAL 

我的編程邏輯提供在陣列形式中的值「(1,7,8)」和值的這個陣列中的量每次我需要運行SQL語句時都會有所不同。如果我可以以某種方式將此數組粘貼到現有的SQL語句中,而不是在每次運行時重新生成SQL語句,併爲數組中的每個值創建「OR」語句,那將非常方便。

有沒有辦法做到這一點?我使用MySQL btw。

Thanx提前,保持良好的編程!

+0

您的「編程邏輯」是否可以傳遞一個表,因爲SQL最適合表,而不是分隔列表? – JNK

+0

這張桌子怎麼樣? 如果它是這樣的: SELECT(1,7,8)FROM DUAL 那麼這將是可能的,但我可以將其構建到SQL語句中。我仍然看不到我如何測試SQL數組的值。 –

+0

在.net中就像一個'datatable'或一個數組。逗號分隔的列表不是數組,它是一個字符串。 – JNK

回答

1

您可以使用逗號分隔字符串的REGEXP。您必須首先將值轉換爲字符串。

SELECT REPLACE(CONCAT(",", "1, 7, 8", ",")," ", "") 
     REGEXP CONCAT(",", REPLACE(REPLACE("1 ,2 , 3 , 4 ,5 " ," ", ""),",", ",|,"), ",") 
FROM DUAL 

說明:

  • 這僅適用於以逗號分隔字符串,不列爲在 例子。
  • 該語句從字符串中刪除所有空格。
  • 在字符串的兩端添加逗號以避免部分匹配。
  • 在正則表達式模式中,所有逗號均由逗號+管道符號+逗號替換,因此它作爲OR運行,同時避免部分匹配。
+0

這就像一個魅力!你一定是一位出色的程序員! –

1

你可以使用一個簡單的連接創建一個動態/臨時表,並與其他值進行簡單連接嗎?

create table a (
id int); 

insert into a values (1),(7),(8); 

create table b like a; 

insert into b values (1),(2),(3),(4),(5); 


select a.* from a 
inner join b 
on a.id = b.id 
+0

我很好奇查詢計劃是否與您的答案和SELECT a。* from a where a.id IN(SELECT b.id FROM b)'相同。你認爲'EXPLAIN'會揭示這兩個查詢是否相同? –

+0

這似乎是一個很好的方法,thanx! –

+0

@ Kirk Olson。別客氣。 @克里斯坎寧安。我通常傾向於避免使用IN子句,因爲AFAIK在mysql版本<5.5時速度較慢,但​​我不是一個關於像Quassnoi和其他SO用戶那樣的查詢優化的sql專家;) –