我在Amazon Redshift
中有一个名为asmt.questions
的表,该表中有一个名为encodedids
的字段。该字段为varchar
,并且可以使用逗号分隔的值。
我想检索所有具有以下任何值的记录:
MAT.GEO.107
MAT.GEO.403
MAT.GEO.409.01
MAT.GEO.504.07
MAT.GEO.901.5
为此,我编写了以下查询:
SELECT questionid,
encodedids,
irt_a
FROM asmt.questions
WHERE ispublic = TRUE
AND encodedids similar TO '%(MAT.GEO.107|MAT.GEO.403|MAT.GEO.409.01|MAT.GEO.504.07|MAT.GEO.901.5)%'
AND encodedids NOT similar TO '%(MAT.GEO.107.|MAT.GEO.403.|MAT.GEO.409.01.|MAT.GEO.504.07.|MAT.GEO.901.5.)%'
AND irt_a IS NOT NULL
ORDER BY encodedids,
irt_a DESC
此查询的工作不错,但它还会返回具有以下值的记录:
MAT.GEO.10701 (note the added '01' in the end)
MAT.GEO.40301 (note the added '01' in the end)
MAT.GEO.409.0101 (note the added '01' in the end)
MAT.GEO.504.0702 (note the added '02' in the end)
MAT.GEO.901.502 (note the added '02' in the end)
如何确定要比较的字符串的长度,以便仅获得所需的值?
任何帮助将不胜感激。
答案 0 :(得分:1)
将值存储在定界字符串中是一个非常糟糕的主意。您应该使用联结表。
有时候,我们会陷入别人的错误决定中。我可能会去:
where ',' || encodedids || ',' like '%,MAT.GEO.107,%' or
',' || encodedids || ',' like '%,MAT.GEO.403,%' or
',' || encodedids || ',' like '%,MAT.GEO.409.01,%' or
',' || encodedids || ',' like '%,MAT.GEO.504.07,%' or
',' || encodedids || ',' like '%,MAT.GEO.901.5,%'
您可以对正则表达式使用相同的定界概念:
where ',' || encodedids || ',' ~ ',MAT.GEO.107,|,MAT.GEO.403,|,MAT.GEO.409.01,|,MAT.GEO.504.07,|,MAT.GEO.901.5,'