2009-03-04 51 views
6

我試圖找到一種方法,如果可能的話,使用IN和LIKE在一起。我想要完成的是將一個將數據列表拖入IN語句的子查詢。問題是數據列表包含通配符。有沒有辦法做到這一點?有什麼辦法可以在SQL語句中結合IN和LIKE?

只是我很好奇。

Example of data in the 2 tables 

Parent table 

ID Office_Code Employee_Name 
1  GG234   Tom 
2  GG654   Bill 
3  PQ123   Chris 

Second table 

ID Code_Wildcard 
1  GG% 
2  PQ% 

(通過第三方)

因爲我看到若干答覆這不似是解決什麼Ziltoid要求,明確記我想我嘗試澄清什麼,我想他的意思。

在SQL中,「WHERE col IN (1,2,3)」大致相當於「WHERE col = 1 OR col = 2 OR col = 3」。

他在找一些東西,我會僞代碼爲

WHERE col IN_LIKE ('A%', 'TH%E', '%C') 

這將是

WHERE col LIKE 'A%' OR col LIKE 'TH%E' OR col LIKE '%C' 

正則表達式的答案似乎是最接近大致相等的;其餘的看起來不合格。

+0

有沒有一種方法可以爲我們提供一組樣式表/記錄,然後給我們預期的/期望的輸出?這將幫助人們構建一個可滿足您需求的查詢。 – TheTXI 2009-03-04 14:27:13

+0

您是否可以指定RDBMS,以便人們可以針對您的問題提出最佳答案?謝謝。 – Sung 2009-03-04 14:33:52

+0

添加了我使用的數據示例 – Ziltoid 2009-03-04 14:51:15

回答

8

我不確定您使用的是哪個數據庫,但使用Oracle,您可以通過在FROM子句中將子查詢別名而不是在IN子句中使用它來實現相同的效果。使用你的例子:

select p.* 
from 
    (select code_wildcard 
    from second 
    where id = 1) s 
    join parent p 
     on p.office_code like s.code_wildcard 
2

您可以使用LIKE語句獲取ID列表,然後在IN語句中使用它。

但是你不能直接組合IN和LIKE。

3

你的意思是somethign像:

select * FROM table where column IN (
    SELECT column from table where column like '%%' 
) 

真的這應該這樣寫:

SELECT * FROM table where column like '%%' 

使用子選擇查詢確實是有益的,當你有一個基於一組拉記錄在主查詢中不需要的邏輯。

類似:

SELECT * FROM TableA WHERE TableA_IdColumn IN 
(
    SELECT TableA_IdColumn FROM TableB WHERE TableA_IDColumn like '%%' 
) 

更新問題:

你不能用類似的語句相結合的陳述:

你必須要做三個不同的像語句搜索各種通配符。

+0

否。該列中的數據實際上包含通配符。 – Ziltoid 2009-03-04 14:43:29

+0

外部查詢什麼都不做。 – 2009-03-04 14:46:00

6

MySQL,使用REGEXP

WHERE field1 REGEXP('(value1)|(value2)|(value3)') 

同在Oracle

WHERE REGEXP_LIKE(field1, '(value1)|(value2)|(value3)') 
0

你可以做一個子查詢也許像部分?

SELECT * FROM表A其中X在

0

TSQL有全文搜索啓用表的contains聲明(從表B,其中B LIKE '%123%' 選擇A)。

CONTAINS(Description, '"sea*" OR "bread*"') 
2

也許是這樣的?

SELECT DISTINCT 
    my_column 
FROM 
    My_Table T 
INNER JOIN My_List_Of_Value V ON 
    T.my_column LIKE '%' + V.search_value + '%' 

在這個例子中,我使用了一個簡單的值表,但你可以很容易地將其改爲子查詢。如果你有一個很大的列表(比如成千上萬),那麼性能可能會很糟糕。

0

如果我正確地閱讀了這個問題,我們需要具有與「Second」表中任何Code_Wildcard匹配的Office_code的所有Parent行。

在Oracle中,至少,這個查詢實現了:

SELECT * 
FROM parent, second 
WHERE office_code LIKE code_wildcard; 

我缺少的東西?

1
select * 
    from parent 
where exists(select * 
       from second 
       where office_code like trim(code_wildcard)); 

修剪code_wildcard以防萬一它已經尾隨空白。

相關問題