选择逗号分隔的字符串是否包含值

Nod*_*bek 0 regex sql postgresql delimited-text

我有桌子

raw TABLE 
=========
id             class_ids
------------------------
1              1234,12334,12341,1228
2              12281,12341,12283 
3              1234,34221,31233,43434,1123
Run Code Online (Sandbox Code Playgroud)

如果 class_ids 包含特殊 id,如何定义正则表达式以选择原始数据。如果我们选择'1234'在 class_ids 中的 raws 结果列表不应该包含 '12341'在 class_ids 中的 raws。

列中的 IDclass_ids,

SELECT FROM raw re WHERE re.class_ids LIKE (regex)
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 5

您不应该将逗号分隔的值存储在单个列中。


但是,在 Postgres 中使用 string_to_array() 而不是正则表达式更好:

SELECT *
FROM raw 
WHERE '1234'= any(string_to_array(class_ids, ','));
Run Code Online (Sandbox Code Playgroud)

如果您真的想对数据进行反规范化,最好将这些数字存储在适当的整数数组中,而不是用逗号分隔的字符串列表


Gor*_*off 5

一个简单的方法使用like

where ',' || re.class_ids || ',' like '%,1234,%'
Run Code Online (Sandbox Code Playgroud)

然而,这不是真正的问题。您不应该将 id 列表存储在字符串中。存储它们的 SQLish 方式将有一个表,每个表一行id,每个表一行class_id。这称为联结表。

即使你不使用单独的表,你至少应该使用Postgres的内置机制,例如数组。但是,单独的表是首选方法,因为您可以显式声明外键关系。