postgres - с использованием SIMILAR TO в предложении CASE - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть столбец, который содержит строку отсканированного штрих-кода.Я хочу найти конкретное совпадение и вернуть в новом столбце строку 'match' и 'noMatch'

Регулярное выражение для штрих-кода:

'[0-9] {5,8} \% [0-9] * \% '

например, 13412432% 10000%

Мой запрос

SELECT 
report."barcode" SIMILAR TO '[0-9]{5,8}\%[0-9]*\%',
(CASE report."barcode" WHEN (report."barcode" SIMILAR TO '[0-9]{5,8}\%[0-9]*\%') THEN 'match'
ELSE 'noMatch'
END) AS matchColumn
FROM report

Однако я'm всегда получает эту ошибку

ОШИБКА: оператор не существует: text = логическое значение LINE 3: (CASE report. "barcode" WHEN (report. "barcode ...

HINT: Ни один оператор не соответствует данному имени и типу (аргументам) аргументов. Возможно, вам потребуется добавить явные приведения типов. Состояние SQL: 42883 Символ: 106

Я довольно новичок в SQL, поэтому, когда документыговорит, что ожидает утверждения истина / ложь после КОГДА я подумал, что могу использовать SIMIAR TO сопоставление с образцом, так как он возвращает логическое значение.

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

вам просто нужно пропустить report."barcode" после регистра

          Case --omit this report."barcode
              when  ......
0 голосов
/ 29 декабря 2018

У меня есть все основания (https://stackoverflow.com/a/12459689/1278553)), что нет веских оснований для использования «похожих на». По ссылке:

SIMILAR TO является частью SQLстандартный, но это очень странный синтаксис, и единственная причина, по которой PostgreSQL его поддерживает, - это соответствие стандарту. Внутренне каждое выражение SIMILAR TO переписывается регулярным выражением. Поэтому для любого данного выражения SIMILAR TO существует по крайней мере одинregexp делает ту же работу быстрее.

На этой заметке, если вы измените это на обычное регулярное выражение, оно должно быть даже таким простым:

select
  r.barcode, 
  case
    when r.barcode ~ '\d{5,8}%\d+%' then 'match'
    else 'noMatch'
  end as matchcolumn
from report r

Вы невам не нужно экранировать символ % с помощью регулярного выражения.

Если вы не согласны с этим шаблоном, возникающим в середине строки, вы можете привязать начало и / или конец регулярного выражения:

'^\d{5,8}%\d+%$'
0 голосов
/ 29 декабря 2018

У вас есть дополнительная ссылка на столбец после case.Вы хотите выражение:

SELECT report."barcode" SIMILAR TO '[0-9]{5,8}\%[0-9]*\%',
       (CASE WHEN report."barcode" SIMILAR TO '[0-9]{5,8}\%[0-9]*\%' 
             THEN 'match'
             ELSE 'noMatch'
        END) AS matchColumn
FROM report;
...