在分号分隔的列表中搜索 SQL 中的特定值
Posted
技术标签:
【中文标题】在分号分隔的列表中搜索 SQL 中的特定值【英文标题】:Search a semicolon delimited list for specific values in SQL 【发布时间】:2016-03-11 21:35:49 【问题描述】:我正在使用 Netezza。我有一个存储如下数据的字段,以水果为例:
Fruits
----------------
APPLE; PEAR; ORANGE
PEAR
BANANA; LEMON; APPLE
APPLE; ORANGE
我想返回仅包含“Apple”、“Pear”或“Orange”组合的行。所以从上面的数据集中,我想要返回的行是:
Fruits
-----------------
APPLE; PEAR; ORANGE
PEAR
APPLE; ORANGE
原始表中的第三条记录没有返回,因为即使它有单词“Apple”,它也包含单词“Banana”和“Lemon”,而我只想要包含一个或多个“Apple”的行、“梨”或“橙”。所有值均以分号分隔。有没有办法做到这一点?
【问题讨论】:
如果您有一组特定的条目,因此无法获得类似HFfsdsSHOrange
的内容,那么您始终可以使用LIKE
语句。例如。 SELECT * FROM table WHERE Fruits LIKE "%APPLE%" OR Fruits LIKE "%PEAR%" OR FRUITS LIKE "%ORANGE%";
【参考方案1】:
您可以通过替换来做到这一点。删除您不喜欢的字符串并确保没有留下任何内容:
select f.*
from fruits f
where replace(replace(replace(replace(replace(col, 'APPLE', ''), 'PEAR', ''), 'ORANGE', ''), ';', ''), ' ', '') = '';
【讨论】:
最终结果有点长(我总共有 10 个字符串),但它有效!谢谢。【参考方案2】:Netezza 支持正则表达式,你可以删除所有这些关键字并检查结果是否为空:
WHERE REGEXP_REPLACE(col, '( )0,1(APPLE|PEAR|ORANGE);0,1', '', 1, 0, 'i') = ''
这也删除了可选的前导空格和尾随分号。
编辑:
另一个简化版本:
REGEXP_REPLACE(col, '(APPLE|PEAR|ORANGE|;|( ))', '', 1, 0, 'i')
【讨论】:
我刚试过这个,得到以下错误:无法识别满足给定参数类型的函数。您可能需要添加显式类型转换。 @user3642531:不同的 DBMS 对正则表达式有一些细微的语法变化。看来您需要添加替换字符串,我会修复我的答案.... 此代码仅返回仅包含列表中第一个值的行(因此在示例中,仅返回 APPLE)。也许我做错了什么? @user3642531:我不知道 Netezza 中具体的正则表达式实现,这是一个适用于我的 Teradata 的通用正则表达式(也应该适用于 Oracle)。我又加了一个简化版,不知道在Netezza上能不能用…… 我希望我对正则表达式足够精通,以确定问题所在......但感谢您的建议!以上是关于在分号分隔的列表中搜索 SQL 中的特定值的主要内容,如果未能解决你的问题,请参考以下文章
Oracle - 将 XML 节点值提取到以分号作为分隔符的列表中