SQL中有"LIKE"和"IN"的组合吗?

42 浏览
0 Comments

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%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

我正在使用SQL Server和Oracle,但我想知道这是否在任何RDBMS中都可以实现。

admin 更改状态以发布 2023年5月24日
0
0 Comments

如果要使您的语句易于阅读,您可以使用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谓词。所以这些例子只是为了好玩。

0
0 Comments

在SQL中没有LIKE和IN的组合,更不用说在TSQL(SQL服务器)或PLSQL(Oracle)中了。这部分原因是因为全文搜索(FTS)是推荐的替代方案。

Oracle和SQL服务器的FTS实现都支持CONTAINS关键字,但语法仍有些不同:

Oracle:

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

SQL服务器:

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

您正在查询的列必须是全文索引的。

参考:

0