有没有办法在SQL语句中将IN与LIKE结合起来?

时间:2009-03-04 14:23:23

标签: sql

我试图找到一种方法,如果可能的话,一起使用IN和LIKE。我想要完成的是放置一个子查询,将一个数据列表提取到一个IN语句中。问题是包含通配符的数据列表。有没有办法做到这一点?

我很好奇。

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'

正则表达式的答案似乎最接近;其余的看起来很不合适。

9 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

MySQL中,使用REGEXP

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

Oracle

相同
WHERE REGEXP_LIKE(field1, '(value1)|(value2)|(value3)')

答案 2 :(得分:3)

你是说像某些人一样:

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 '%%'
)

更新问题:

您不能将IN语句与like语句结合使用:

你必须做三个不同的语句来搜索各种通配符。

答案 3 :(得分:2)

您可以使用LIKE语句获取ID列表,然后在IN语句中使用它。

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

答案 4 :(得分:2)

也许是这样的?

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

在这个例子中,为了简单起见,我使用了一个带有值的表,但您可以轻松地将其更改为子查询。如果你有一个大的列表(如数万),那么性能可能会很糟糕。

答案 5 :(得分:1)

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

修剪code_wildcard以防万一有尾随空白。

答案 6 :(得分:0)

您可以在子查询中执行Like部分吗?

从TableA中选择*其中X in(从表B中选择A,其中B代表'%123%')

答案 7 :(得分:0)

tsql具有启用全文搜索的表的contains语句。

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

答案 8 :(得分:0)

如果我正确地阅读了这个问题,我们希望所有具有Office_code的Parent行与“Second”表中的任何Code_Wildcard匹配。

至少在Oracle中,此查询实现了:

SELECT * 
FROM parent, second 
WHERE office_code LIKE code_wildcard;

我错过了什么吗?