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

时间:2016-09-26 10:54:38

标签: sql regex postgresql delimited-text

我有桌子

CREATE FUNCTION REPLICATE(input NVARCHAR(1000), count INT)
RETURNS output NVARCHAR(1000)
LANGUAGE SQLSCRIPT AS
BEGIN
    DECLARE i INT = 1;
    output := '';
    FOR i IN 1 .. count DO
        output := output || input;
    END FOR;
END;

如果class_ids包含特殊ID,如何定义正则表达式以选择原始数据。 如果我们在class_ids中选择带raw TABLE ========= id class_ids ------------------------ 1 1234,12334,12341,1228 2 12281,12341,12283 3 1234,34221,31233,43434,1123 的原始数据,则结果列表不应包含class_ids中带有'1234'的原始数据。

'12341'中的ID与class_ids

分隔
,

3 个答案:

答案 0 :(得分:4)

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

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

SELECT *
FROM raw 
WHERE '1234'= any(string_to_array(class_ids, ','));

如果你真的想要对数据进行去规范化,最好将这些数字存储在一个正确的整数数组中,而不是以逗号分隔的字符串列表

答案 1 :(得分:3)

如果您真的想用正则表达式执行此操作,可以使用~运算符:

SELECT FROM raw re WHERE re.class_ids ~ '^(^|,)1234(,|$)$';

但我更喜欢a_horse_with_no_name使用数组的答案。

答案 2 :(得分:2)

使用like的简单方法:

where ',' || re.class_ids || ',' like '%,1234,%'

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

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

相关问题