首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL中有"LIKE“和" in”的组合吗?

SQL中有"LIKE“和" in”的组合吗?
EN

Stack Overflow用户
提问于 2010-06-10 21:44:17
回答 16查看 620.3K关注 0票数 398

在SQL中(遗憾的是),由于数据库违反了几乎所有的规范化规则,所以常常不得不使用"LIKE“条件。我现在无法改变这一点。但这与问题无关。

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

有没有可能在不编写复杂的子选择的情况下将这两件事结合起来呢?

我想要像WHERE something LIKE ('bla%', '%foo%', 'batz%')这样简单的东西,而不是这样:

代码语言:javascript
复制
WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

我在这里使用Oracle服务器和SQl,但我感兴趣的是,这在任何关系型数据库中是否都是可能的。

EN

回答 16

Stack Overflow用户

发布于 2010-06-10 21:48:24

你被卡住了

代码语言:javascript
复制
WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

除非您填充一个临时表(将通配符包含在数据中)并像这样连接:

代码语言:javascript
复制
FROM YourTable                y
    INNER JOIN YourTempTable  t On y.something LIKE t.something

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

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
x
----------
abcdefg
abc

(2 row(s) affected)

x
----------
abc
abcdefg

(2 row(s) affected)
票数 55
EN

Stack Overflow用户

发布于 2011-04-21 17:17:35

有了PostgreSQL就有了ANY or ALL form:

代码语言:javascript
复制
WHERE col LIKE ANY( subselect )

代码语言:javascript
复制
WHERE col LIKE ALL( subselect )

其中subselect恰好返回一列数据。

票数 23
EN

Stack Overflow用户

发布于 2016-10-18 17:54:01

另一种解决方案应该适用于任何RDBMS:

代码语言:javascript
复制
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可以替换为另一个模式源,如表(或视图),其方式如下:

代码语言:javascript
复制
WHERE EXISTS (SELECT 1
                FROM table_of_patterns t
               WHERE something LIKE t.pattern)

table_of_patterns应该至少包含一个列pattern,并且可以像这样填充:

代码语言:javascript
复制
INSERT INTO table_of_patterns(pattern) VALUES ('bla%');
INSERT INTO table_of_patterns(pattern) VALUES ('%foo%');
INSERT INTO table_of_patterns(pattern) VALUES ('batz%');
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3014940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档