在分号分隔的列表中搜索 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 中的特定值的主要内容,如果未能解决你的问题,请参考以下文章

在databricks SQL中的字段中输出分号分隔的值

Oracle - 将 XML 节点值提取到以分号作为分隔符的列表中

解析分号分隔的列表

sql SQL - 在以逗号,管道或分号或任何其他字符分隔的列中获取多个值或连接值的值

将python中的列表保存为分号分隔的文本文件

将平面文件中的数据导入sql时如何选择列范围,如果文件中的数据没有用逗号和分号等任何标签分隔