在SQL中,我很遗憾地经常不得不使用“ LIKE
”条件,因为数据库几乎违反了每个规范化规则 . 我可以_1828057_与这个问题无关 .
此外,我经常使用像_1528058这样的条件来提高SQL语句的可读性和灵活性 .
在没有编写复杂的子选择的情况下,有没有可能将这两种方法结合起来?
我想要一些像 WHERE something LIKE ('bla%', '%foo%', 'batz%')
一样简单的东西而不是这个:
WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'
我在这里使用SQl Server和Oracle,但我很感兴趣,如果在任何RDBMS中都可以这样做 .
22 回答
SQL中没有LIKE和IN的组合,更不用说TSQL(SQL Server)或PLSQL(Oracle) . 部分原因是因为全文搜索(FTS)是推荐的替代方案 .
Oracle和SQL Server FTS实现都支持CONTAINS关键字,但语法仍然略有不同:
甲骨文:
SQL Server:
参考:
Building Full-Text Search Applications with Oracle Text
Understanding SQL Server Full-Text
如果您想使您的语句易于阅读,那么您可以使用REGEXP_LIKE(从Oracle版本10开始) .
示例表:
原始语法:
使用REGEXP_LIKE进行简单查看
BUT ...
由于性能不佳,我不会自己推荐它 . 我坚持使用几个LIKE谓词 . 所以这些例子只是为了好玩 .
你被困在了
除非你填充临时表(包括带有数据的通配符)并加入如下:
尝试一下(使用SQL Server语法):
OUTPUT:
使用PostgreSQL有ANY or ALL form:
要么
subselect只返回一列数据 .
如果您想要封装上面显示的内部连接或临时表技术,我建议使用TableValue用户函数 . 这样可以让它读得更清楚一些 .
使用在以下位置定义的拆分功能后:http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx
我们可以根据我创建的名为“Fish”的表(int id,varchar(50)Name)编写以下内容
输出
另一个解决方案应该适用于任何RDBMS:
一种方法是将条件存储在临时表(或SQL Server中的表变量)中并加入到这样的:
改为使用内连接:
你甚至可以试试这个
功能
询问
我也想知道这样的事情 . 我刚刚使用
SUBSTRING
和IN
的组合进行了测试,它是解决此类问题的有效方法 . 请尝试以下查询:我有一个简单的解决方案,至少在 postgresql 中工作,使用
like any
后跟正则表达式列表 . 这是一个例子,看一下列表中的一些抗生素:对于Sql Server,您可以使用动态SQL .
大多数情况下,在这种情况下,您可以根据数据库中的某些数据获得IN子句的参数 .
下面的示例有点“强制”,但这可以匹配遗留数据库中的各种实际案例 .
假设您有表 Persons ,其中人名存储在单个字段 PersonName 中作为FirstName ' ' LastName . 您需要从名字列表中选择所有人,存储在表 NamesToSelect 中的字段 NameToSelect 中,以及一些其他标准(例如按性别,出生日期等过滤)
你可以这样做
我可能有一个解决方案,虽然它只能在我知道的SQL Server 2008中工作 . 我发现您可以使用https://stackoverflow.com/a/7285095/894974中描述的行构造函数使用like子句加入'fictional'表 . 它听起来更复杂,看起来:
这将导致所有用户都拥有类似列表中提供的电子邮件地址 . 希望它对任何人都有用 . 这个问题困扰了我一段时间 .
Teradata支持LIKE ALL/ANY语法:
如果你使用MySQL,你可以得到的最接近的是全文搜索:
Full-Text Search, MySQL Documentation
这适用于逗号分隔值
评估到:
如果要使用索引,则必须省略第一个
'%'
字符 .在Oracle中,您可以通过以下方式使用集合:
这里我使用了预定义的集合类型
ku$_vcnt
,但您可以像这样声明自己的集合类型:在Oracle RBDMS中,您可以使用REGEXP_LIKE函数实现此行为 .
以下代码将测试字符串 three 是否存在于列表表达式 one|two|three|four|five 中(其中管道“ | ”符号表示OR逻辑运算) .
前面的表达式相当于:
所以它会成功 .
另一方面,以下测试将失败 .
自10g版本以来,Oracle中有几个与正则表达式(REGEXP_ *)相关的函数 . 如果您是Oracle开发人员并且对此主题感兴趣,这应该是一个良好的开端Using Regular Expressions with Oracle Database .
没有这样的答案:
在oracle没问题 .
从2016年开始,SQL Server包含
STRING_SPLIT
function . 我正在使用SQL Server v17.4,我让它为我工作:在Teradata中,您可以使用
LIKE ANY ('%ABC%','%PQR%','%XYZ%')
. 下面是一个为我产生相同结果的例子做这个
要么