【问题标题】:Is it possible to use LIKE and IN for a WHERE statment?是否可以将 LIKE 和 IN 用于 WHERE 语句?
【发布时间】:2011-05-19 03:12:19
【问题描述】:

我有一个地名列表,并希望将它们与 sql 数据库中的记录相匹配,问题是属性在名称后有参考编号。例如。 '巴利米纳 P-4sdf5g' 是否可以使用 IN 和 LIKE 来匹配记录

WHERE dbo.[Places].[Name] IN LIKE('Ballymena%','Banger%')

【问题讨论】:

    标签: sql


    【解决方案1】:

    不,但您可以使用 OR:

    WHERE (dbo.[Places].[Name] LIKE 'Ballymena%' OR
           dbo.[Places].[Name] LIKE 'Banger%')
    

    【讨论】:

      【解决方案2】:

      对于构造,这是一个常见的误解

      b IN (x, y, z)
      

      (x, y, z) 代表一个集合。它不是。

      相反,它只是语法糖

      (b = x OR b = y OR b = z)
      

      SQL 只有一种数据结构:表。如果要将搜索文本值作为一组查询,则将它们放入表中。然后您可以在JOIN 条件中使用LIKE 将您的搜索文本表JOIN 到您的Places 表,例如

      WITH Places (Name)
           AS
           (
            SELECT Name
              FROM (
                    VALUES ('Ballymeade Country Club'), 
                           ('Ballymena Candles'), 
                           ('Bangers & Mash Cafe'), 
                           ('Bangebis')
                   ) AS Places (Name)
           ), 
           SearchText (search_text)
           AS
           (
            SELECT search_text
              FROM (
                    VALUES ('Ballymena'), 
                           ('Banger')
                   ) AS SearchText (search_text)
           )
      SELECT * 
        FROM Places AS P1
             LEFT OUTER JOIN SearchText AS S1
                ON P1.Name LIKE S1.search_text + '%';
      

      【讨论】:

        【解决方案3】:

        一个简单的解决方案是使用正则表达式,不确定它是如何在 sql 中完成的,但可能与此类似

        WHERE dbo.[Places].[Name]  SIMILAR TO '(Banger|Ballymena)';
        

        WHERE dbo.[Places].[Name] REGEXP_LIKE(dbo.[Places].[Name],'(Banger|Ballymena)');
        

        其中一个应该至少可以工作

        【讨论】:

        • similar to 应该在标准中被 regexp_like 取代。我们拭目以待。
        【解决方案4】:

        你可以使用 OR

        WHERE 
          dbo.[Places].[Name] LIKE 'Ballymena%' 
          OR dbo.[Places].[Name] LIKE 'Banger%'
        

        如果places.name 是always,则在空格处拆分字符串。

        WHERE SUBSTRING(dbo.[Places].[Name], 1, CHARINDEX(dbo.[Places].[Name], ' ')) 
          IN ('Ballymena', 'Banger')
        

        这可能会降低性能,因为数据库可能能够使用带有 like 的索引(如果通配符在最后,你有更好的机会),但在使用子字符串时很可能不会。

        【讨论】:

        • 不幸的是,有些地名中有空格,但仍然是一个很好的解决方案 +1
        猜你喜欢
        • 1970-01-01
        • 2016-03-16
        • 2018-03-08
        • 2016-05-21
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多