Оператор PostgreSQL В не работает, но сопоставление шаблонов работает

#sql #postgresql

Вопрос:

как говорится в названии, пожалуйста, найдите блок кодов, которые работали и не работали соответственно.

 select *
from public.transactions
where id in ('ABCDE-3131243553O2')
 

Запрос выше не сработал, но тот, что ниже, сработал.

 select *
from public.transactions
where id ~* 'ABCDE-3131243553O2'
 

Кто — нибудь знает какую-то конкретную причину, почему? Я гуглил, но безрезультатно. Заранее спасибо!

Комментарии:

1. Покажите нам ваши примерные данные, пожалуйста

2. ~* не зависит от регистра, in чувствителен к регистру. — К вашему сведению: in с одним значением это то же самое, что = . — Для соответствия регулярному выражению с учетом регистра используйте ~ без * .

3. Вероятно, это, вероятно, чувствительность к регистру? ~ * — это совпадение с шаблоном без учета регистра, где, как я подозреваю, вероятно, будет врожденное совпадение с учетом регистра.

4. Я понимаю. Как вы предлагаете мне поступить, если бы у меня было несколько удостоверений личности?

5. Пожалуйста, добавьте какой-нибудь пример

Ответ №1:

Они совсем не эквивалентны. Считать:

 where id ~* 'ABCDE-3131243553O2'
 

Это соответствует любой строке, содержащей выражение. Например, это возвращает обе строки.

 select *
from (values ('ABCDE-3131243553O2'), ('blahblahblahABCDE-3131243553O2foofoofoo')) v(id)
where  id ~* 'ABCDE-3131243553O2';
 

Эквивалентное регулярное выражение для = или in равно:

 where id ~* '^ABCDE-3131243553O2

Это закрепляет шаблон, поэтому никакие другие символы не допускаются.

Если вы не получаете совпадение, используя in  , когда вы его ожидаете, то вероятной причиной являются скрытые символы в данных (или, возможно, значение сравнения). Наиболее распространенными "скрытыми" символами являются пробелы в начале или конце. Другой проблемой могут быть похожие персонажи.  1  Действительно  1  ли это а или нижний регистр  L  ?


Это закрепляет шаблон, поэтому никакие другие символы не допускаются.

Если вы не получаете совпадение, используя in , когда вы его ожидаете, то вероятной причиной являются скрытые символы в данных (или, возможно, значение сравнения). Наиболее распространенными «скрытыми» символами являются пробелы в начале или конце. Другой проблемой могут быть похожие персонажи. 1 Действительно 1 ли это а или нижний регистр L ?