2009-03-04 117 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以防万一它已经尾随空白。

相关问题