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)
但是,在 Postgres 中使用 string_to_array() 而不是正则表达式更好:
SELECT *
FROM raw
WHERE '1234'= any(string_to_array(class_ids, ','));
Run Code Online (Sandbox Code Playgroud)
如果您真的想对数据进行反规范化,最好将这些数字存储在适当的整数数组中,而不是用逗号分隔的字符串列表
一个简单的方法使用like:
where ',' || re.class_ids || ',' like '%,1234,%'
Run Code Online (Sandbox Code Playgroud)
然而,这不是真正的问题。您不应该将 id 列表存储在字符串中。存储它们的 SQLish 方式将有一个表,每个表一行id,每个表一行class_id。这称为联结表。
即使你不使用单独的表,你至少应该使用Postgres的内置机制,例如数组。但是,单独的表是首选方法,因为您可以显式声明外键关系。
| 归档时间: |
|
| 查看次数: |
2076 次 |
| 最近记录: |