Сравнение строк фиксированной длины в Amazon Redshift - PullRequest
0 голосов
/ 29 июня 2018

У меня есть таблица в 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 голосов
/ 29 июня 2018

Хранение значений в разделенных строках - очень плохая идея. Вы должны использовать соединительную таблицу.

Иногда мы застряли с очень плохими решениями других людей. Я бы, наверное, пошел на:

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,'
...