SQL中有“LIKE”和“IN”的组合吗?

在SQL中,我(很遗憾)常常不得不使用“ LIKE ”条件,因为数据库几乎违反了每个规范化规则。 我现在无法改变这一点。 但这与问题无关。

此外,我经常使用WHERE something in (1,1,2,3,5,8,13,21)条件来提高我的SQL语句的可读性和灵活性。

有没有什么可能的方式来结合这两件事情,而不写复杂的子选择?

我希望像WHERE something LIKE ('bla%', '%foo%', 'batz%')东西一样简单WHERE something LIKE ('bla%', '%foo%', 'batz%')而不是

WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

我正在与SQl Server和Oracle合作,但我对任何RDBMS中都可能有此感兴趣。


在SQL中没有LIKE&IN的组合,更少的是TSQL(SQL Server)或PLSQL(Oracle)。 部分原因是因为全文搜索(FTS)是推荐的选择。

Oracle和SQL Server FTS实现都支持CONTAINS关键字,但语法仍略有不同:

甲骨文:

WHERE CONTAINS(t.something, 'bla OR foo OR batz', 1) > 0

SQL Server:

WHERE CONTAINS(t.something, '"bla*" OR "foo*" OR "batz*"')

参考:

  • 使用Oracle Text构建全文搜索应用程序
  • 了解SQL Server全文

  • 如果您想让您的语句易于阅读,那么您可以使用REGEXP_LIKE(可从Oracle 10版开始提供)。

    一个示例表格:

    SQL> create table mytable (something)
      2  as
      3  select 'blabla' from dual union all
      4  select 'notbla' from dual union all
      5  select 'ofooof' from dual union all
      6  select 'ofofof' from dual union all
      7  select 'batzzz' from dual
      8  /
    
    Table created.
    

    原始语法:

    SQL> select something
      2    from mytable
      3   where something like 'bla%'
      4      or something like '%foo%'
      5      or something like 'batz%'
      6  /
    
    SOMETH
    ------
    blabla
    ofooof
    batzzz
    
    3 rows selected.
    

    以及使用REGEXP_LIKE的简单查询查询

    SQL> select something
      2    from mytable
      3   where regexp_like (something,'^bla|foo|^batz')
      4  /
    
    SOMETH
    ------
    blabla
    ofooof
    batzzz
    
    3 rows selected.
    

    但是...

    由于不太好的表现,我不会自己推荐它。 我会坚持使用几个LIKE谓词。 所以这些例子只是为了好玩。


    你一直坚持着

    WHERE something LIKE 'bla%'
    OR something LIKE '%foo%'
    OR something LIKE 'batz%'
    

    除非你填充一个临时表(将数据包含在通配符中)并加入,如下所示:

    FROM YourTable                y
        INNER JOIN YourTempTable  t On y.something LIKE t.something
    

    尝试一下(使用SQL Server语法):

    declare @x table (x varchar(10))
    declare @y table (y varchar(10))
    
    insert @x values ('abcdefg')
    insert @x values ('abc')
    insert @x values ('mnop')
    
    insert @y values ('%abc%')
    insert @y values ('%b%')
    
    select distinct *
    FROM @x x
    WHERE x.x LIKE '%abc%' 
       or x.x LIKE '%b%'
    
    
    select distinct x.*  
    FROM @x             x
        INNER JOIN  @y  y On x.x LIKE y.y
    

    OUTPUT:

    x
    ----------
    abcdefg
    abc
    
    (2 row(s) affected)
    
    x
    ----------
    abc
    abcdefg
    
    (2 row(s) affected)
    
    链接地址: http://www.djcxy.com/p/43771.html

    上一篇: Is there a combination of "LIKE" and "IN" in SQL?

    下一篇: Codeigniter active record sql error