Redshift Ошибка регулярного выражения? - PullRequest
1 голос
/ 07 марта 2019

У меня есть таблица с полем Почтовый индекс Великобритании, и я собираюсь тестировать плохие форматы, используя только регулярные выражения, даже элементарные тесты не работают.

У меня есть значение CM8 2AX.

Если я бегу

выберите почтовый индекс из sor.party_person, где 'CM8 2AX' ~ '. * [0-9] [A-Z] [A-Z] $'

и post_code = 'CM8 2AX';

Я получаю

CM8 2AX

(1 строка)

Что, по-видимому, указывает на то, что мое очень простое регулярное выражение верно для значения.

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

выберите post_code из sor.party_person, где post_code ~ '. * [0-9] [A-Z] [A-Z] $' и post_code = 'CM8 2AX';

(0 строк)

не соответствует.

Чего мне не хватает?

Если я удаляю знак $ в конце, он работает, подразумевая, что БД видит что-то другое как символ конца поля и не распознает последний текстовый символ как последний символ, но для меня это не имеет смысла.

1 Ответ

1 голос
/ 07 марта 2019

Я думаю, что тип данных столбца приводит к добавлению пробельных символов после почтового индекса к размеру столбца, что игнорируется при выполнении =, но, очевидно, при выполнении сопоставления с регулярным выражением.

select post_code from sor.party_person where post_code ~ '.*[0-9][A-Z][A-Z] *$' and post_code = 'CM8 2AX';

Должно работать, доказывая, что это правильно.

Редактировать

Я действовал правильно, но, видимо, не из-за работы =.Стандарт SQL гласит, что при сравнении двух строк неравной длины добавляется более короткая.Таким образом, post_code = 'CM8 2AX' фактически добавляет 'CM8 2AX' к длине столбца post_code перед выполнением сравнения.

...