【问题标题】:Is it possible to use WHERE IN along with LIKE?是否可以将 WHERE IN 与 LIKE 一起使用?
【发布时间】:2010-11-26 14:06:03
【问题描述】:

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

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

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

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

但是,是否可以同时使用两者。也就是说,查询不仅执行 WHERE IN,还执行类似于 WHERE LIKE?一个不查看一组值而是使用通配符搜索一组值的查询。

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

示例 -

让我们考虑一下 -

另一个表 -

  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

【问题讨论】:

  • 添加了示例。希望对您有所帮助。

标签: sql sql-server sql-like


【解决方案1】:
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

【讨论】:

  • 他希望能够做到:WHERE COL1 LIKE (SELECT COL FROM OTHER TABLE)
  • 在我的问题中添加了一个示例。
  • @Pavanred:根据您的示例添加了一个演练。
  • hmm 有趣.. 谢谢,我会试试这个。
  • 注意从 B.Col 中转义值。如果 B.Col = '%',则 like 将是 A.col1 LIKE '%%%',因此所有值都将匹配。 stackoverflow.com/questions/258757/…
【解决方案2】:

是的。使用关键字 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'

【讨论】:

  • 他希望能够做到:WHERE COL1 LIKE (SELECT COL FROM OTHER TABLE)
  • 在我的问题中添加了一个示例。
  • @Pavanred:谢谢你的例子。您将需要编写一个程序(可能是一个存储过程),该程序从 AnotherTable 读取值并构建一个 SQL 查询,其中包含几个可以对 TABLE 执行的 LIKE 子句(由关键字 OR 分隔)
【解决方案3】:

不,因为 LIKE 子句中的每个元素都需要通配符,而 IN 子句没有办法做到这一点

【讨论】:

    【解决方案4】:

    模式匹配运算符有:

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

    这就是字符串匹配的内容,尽管还有其他的string functions

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

    【讨论】:

      【解决方案5】:

      尝试交叉连接,这样您就可以将 AnotherTable 中的每一行与 Table 中的每一行进行比较:

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

      为了安全起见,您需要在 at.col 中转义通配符。试试this answer

      【讨论】:

        【解决方案6】:

        如果我正确理解了这个问题,当“Table.Col1”为“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%')
        

        【讨论】:

        • 我认为你的意思是“at.Col IS NOT NULL AND...” 这个答案的概念是正确的。我怀疑 SQL Server 会自动忽略空值,并且不会尝试使用 LIKE 函数来处理它们。
        • 实际上我的意思是使用 OR(类似于下面 Catalin 的答案,但语法不同)。当 Table.Col1 在 AnotherTable.Col 中以及 Table.Col1 是 LIKE %some_string% 的那些行时,我正在阅读这个问题,因为想要“Table”中的行。
        【解决方案7】:

        这样的?

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

        【讨论】:

        • 在我的问题中添加了一个示例。
        【解决方案8】:

        你在想像 EXISTS 这样的东西吗?

        SELECT * FROM TABLE t WHERE EXISTS (Select col from AnotherTable t2 where t2.col = t.col like '%test_string%' )

        【讨论】:

        • 添加了一个例子来提问更清楚
        • 感谢您的示例。我不得不支持杰夫和莱斯利的意见。您必须为此创建一个存储过程,并且那里的性能不会很好。我会说你需要重新考虑这种方法。
        猜你喜欢
        • 2011-05-19
        • 2020-07-16
        • 1970-01-01
        • 2022-07-19
        • 2016-06-10
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 2016-04-01
        相关资源
        最近更新 更多