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*"')
参考:
如果您想让您的语句易于阅读,那么您可以使用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