SQL中有"LIKE"和"IN"的组合吗?
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日
如果要使您的语句易于阅读,您可以使用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谓词。所以这些例子只是为了好玩。
在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*"')
您正在查询的列必须是全文索引的。
参考: