我有桌子
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
,
答案 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的内置机制,例如数组。但是,单独的表是首选方法,因为您可以显式声明外键关系。