Amazon Redshift中的固定长度字符串比较

时间:2018-06-29 18:10:04

标签: sql postgresql amazon-redshift

我在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)

如何确定要比较的字符串的长度,以便仅获得所需的值?

任何帮助将不胜感激。

1 个答案:

答案 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,'