在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%'
我在这里使用Oracle服务器和SQl,但我感兴趣的是,这在任何关系型数据库中是否都是可能的。
发布于 2010-06-10 21:48:24
你被卡住了
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
输出:
x
----------
abcdefg
abc
(2 row(s) affected)
x
----------
abc
abcdefg
(2 row(s) affected)
发布于 2011-04-21 17:17:35
有了PostgreSQL就有了ANY
or ALL
form:
WHERE col LIKE ANY( subselect )
或
WHERE col LIKE ALL( subselect )
其中subselect恰好返回一列数据。
发布于 2016-10-18 17:54:01
另一种解决方案应该适用于任何RDBMS:
WHERE EXISTS (SELECT 1
FROM (SELECT 'bla%' pattern FROM dual UNION ALL
SELECT '%foo%' FROM dual UNION ALL
SELECT 'batz%' FROM dual)
WHERE something LIKE pattern)
内部select可以替换为另一个模式源,如表(或视图),其方式如下:
WHERE EXISTS (SELECT 1
FROM table_of_patterns t
WHERE something LIKE t.pattern)
table_of_patterns
应该至少包含一个列pattern
,并且可以像这样填充:
INSERT INTO table_of_patterns(pattern) VALUES ('bla%');
INSERT INTO table_of_patterns(pattern) VALUES ('%foo%');
INSERT INTO table_of_patterns(pattern) VALUES ('batz%');
https://stackoverflow.com/questions/3014940
复制相似问题