检查逗号分隔列表是不是包含特定数字[重复]

Posted

技术标签:

【中文标题】检查逗号分隔列表是不是包含特定数字[重复]【英文标题】:Check if a comma separated list contains a specific number [duplicate]检查逗号分隔列表是否包含特定数字[重复] 【发布时间】:2017-06-26 13:20:20 【问题描述】:

我有一列是一个文本字符串,其中包含一个逗号分隔的 id 列表。它可能看起来像这样:

1,2,3,45,65,23245,564747,23,121,54,65,345678

我需要查找它是否包含特定的 id。用正则表达式来获取它是否只包含一个数字将是相当简单的,但问题是,例如,id 4 不在列表中,但很多 ids 包含一个 4。也许它仍然可以写一个可以处理的正则表达式,但这超出了我的水平。或者有没有其他方法可以在 SQL 中解决这个问题?

编辑

澄清一下,我实际上并没有包含逗号分隔列表的列。我所拥有的是一个由查询中的几行组成的 listagg,我希望能够对其应用过滤器。我只是试图简化问题,以便更专注于实际问题。我没有意识到这样做会导致数据库设计的答案比实际问题的答案更多。

【问题讨论】:

如果您的 SQL 数据库中有逗号分隔的列表,则说明您的数据库设计存在错误(即缺少表)。修复错误,而不是查询。 这已经在这里被问了至少 100 次,我只是链接到一个这样的线程。接受的答案至少在一半的线程中也有接受的答案。无需重新发明***。 【参考方案1】:

在逗号分隔的列表中存储值是一种非常糟糕的设计模式,它只会让人头疼。如果可以,请将其标准化。

如果不能,您可以在比较中使用逗号搜索特定 ID:

WHERE [Column] LIKE '%,4,%'
   OR [Column] LIKE '4,%'
   OR [Column] LIKE '%,4'

【讨论】:

... 或者您只需执行 WHERE ',' || [专栏] || ',' LIKE '%,4,%'【参考方案2】:

正如其他人所说,逗号分隔值不好,但如果你想要,这是一种方法:

select * from t where REGEXP_LIKE (col , '(^|,)4(,|$)')

【讨论】:

以上是关于检查逗号分隔列表是不是包含特定数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查存储在varchar列中的逗号分隔列表中是否包含数字?

用PHP检查逗号分隔的字符串中是不是存在值[重复]

在单元格中搜索逗号分隔的数字

逗号分隔的列表正则表达式 [重复]

从包含以逗号分隔的数字的字符串创建列表;蟒蛇 3

使用 argparse 将逗号分隔的多个整数值作为输入,并检查列表中是不是存在这些值