可以和LIKE一起使用WHERE IN吗?

时间:2010-11-26 14:06:03

标签: sql sql-server sql-like

如果我必须搜索某些数据,我可以使用通配符并使用简单的查询 -

SELECT * FROM TABLE WHERE COL1 LIKE '%test_string%'

而且,如果我必须查看许多我可以使用的值 -

SELECT * FROM TABLE WHERE COL1 IN (Select col from AnotherTable)

但是,是否可以将两者结合使用。也就是说,查询不仅执行WHERE IN,还执行类似于WHERE LIKE的操作?一个查询,它不会查看一组值,而是通过一组值使用通配符进行搜索。

如果不清楚,我可举个例子。让我知道。感谢。

示例 -

让我们考虑 -

AnotherTable -

  id  | Col
------|------
  1   |  one
  2   |  two
  3   |  three

表 -

Col   | Col1
------|------
 aa   |  one
 bb   |  two
 cc   |  three
 dd   |  four
 ee   |  one_two
 bb   |  three_two

现在,如果我可以使用

SELECT * FROM TABLE WHERE COL1 IN (Select col from AnotherTable)

这给了我 -

Col   | Col1
------|------
 aa   |  one
 bb   |  two
 cc   |  three

但如果我需要怎么办 -

Col   | Col1
------|------
 aa   |  one
 bb   |  two
 cc   |  three
 ee   |  one_two
 bb   |  three_two

我想这应该可以帮助你理解我在一起使用WHERE IN和LIKE的意思

8 个答案:

答案 0 :(得分:4)

SELECT * 
FROM TABLE A
   INNER JOIN AnotherTable B on
     A.COL1 = B.col
WHERE COL1 LIKE '%test_string%'

根据提供的示例代码,尝试一下。最终的select语句按您的要求显示数据。

create table #AnotherTable
(
    ID int IDENTITY(1,1) not null primary key,
    Col varchar(100)
);

INSERT INTO #AnotherTable(col) values('one')
INSERT INTO #AnotherTable(col) values('two')
INSERT INTO #AnotherTable(col) values('three')

create table #Table
(
    Col varchar(100),
    Col1 varchar(100)
);

INSERT INTO #Table(Col,Col1) values('aa','one')
INSERT INTO #Table(Col,Col1) values('bb','two')
INSERT INTO #Table(Col,Col1) values('cc','three')
INSERT INTO #Table(Col,Col1) values('dd','four')
INSERT INTO #Table(Col,Col1) values('ee','one_two')
INSERT INTO #Table(Col,Col1) values('ff','three_two')

SELECT * FROM #AnotherTable
SELECT * FROM #Table

SELECT * FROM #Table WHERE COL1 IN(Select col from #AnotherTable)


SELECT distinct A.*
FROM #Table A
    INNER JOIN  #AnotherTable B on
        A.col1 LIKE '%'+B.Col+'%'

DROP TABLE #Table
DROP TABLE #AnotherTable

答案 1 :(得分:1)

是。使用关键字AND:

SELECT * FROM TABLE WHERE COL1 IN (Select col from AnotherTable) AND COL1 LIKE '%test_string%'

但在这种情况下,最好使用JOIN语法:

SELECT TABLE.* FROM TABLE JOIN AnotherTable on TABLE.COL1 = AnotherTable.col WHERE TABLE.COL1 LIKE '%test_string'

答案 2 :(得分:1)

不是因为LIKE子句中的每个元素都需要通配符,并且没有办法用IN子句

答案 3 :(得分:1)

模式匹配运算符是:

  1. IN,针对值列表,
  2. LIKE,针对模式,
  3. REGEXP/RLIKE针对正则表达式(包括通配符和替代方法,因此最接近“通过一组valuws使用通配符”,例如(ab)+a|(ba)+b将匹配所有字符串aba ... ba或者bab ... ab),
  4. FIND_IN_SET获取集合中字符串的索引(用逗号分隔的字符串表示),
  5. SOUNDS LIKE根据发音方式和
  6. 比较字符串
  7. MATCH ... AGAINST用于全文匹配。
  8. 这是关于字符串匹配的,尽管还有其他string functions

    对于该示例,您可以尝试加入Table.Col1 LIKE CONCAT(AnotherTable.Col, '%'),但性能可能会很糟糕(假设它有效)。

答案 4 :(得分:1)

尝试交叉连接,以便您可以将AnotherTable中的每一行与表格中的每一行进行比较:

SELECT DISTINCT t.Col, t.Col1
FROM AnotherTable at
CROSS JOIN Table t 
WHERE t.col1 LIKE ('%' + at.col + '%')

为了安全起见,您需要在at.col中删除通配符。请尝试this answer

答案 5 :(得分:1)

如果我正确理解了这个问题,那么当“Table.Col1”是IN“AnotherTable.Col”时你想要“Table”中的行,而当Col1 IS LIKE'%some_string%'时你也想要行。

如果是这样,你想要像:

SELECT 
    t.* 
FROM 
    [Table] t 
LEFT JOIN 
    [AnotherTable] at ON t.Col1 = at.Col 
WHERE (at.Col IS NOT NULL
    OR t.Col1 LIKE '%some_string%')

答案 6 :(得分:0)

这样的东西?

SELECT * FROM TABLE 
WHERE 
   COL1 IN (Select col from AnotherTable) 
   AND COL1 LIKE '%test_string%'

答案 7 :(得分:0)

你在考虑像EXISTS这样的东西吗?

  

SELECT * FROM TABLE t WHERE EXISTS(从AnotherTable t2中选择col,其中t2.col = t.col,如'%test_string%')