Как сравнить два столбца, игнорируя специальные символы?

#regex #string #postgresql #where-clause

#регулярное выражение #строка #postgresql #where-предложение

Вопрос:

Я сравниваю два столбца из разных таблиц, чтобы получить соответствующие записи. Эти таблицы не имеют никакого уникального ключа, кроме имени и фамилии.Но я не получаю правильный вывод, если у TableA есть Aaa’a, а у TableB есть Aaaa. Может ли кто-нибудь посоветовать, как сравнивать, игнорируя специальные символы / любое другое альтернативное решение для их сопоставления?

    SELECT * FROM TableA  A where EXISTS
    (SELECT '' FROM TableB B
                WHERE 
                TRIM(A.namef) = TRIM(B.namef)
                AND TRIM(A.namel) = TRIM(B.namel)
    
    )
  

-Спасибо

Ответ №1:

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

 where 
        regexp_replace(a.namef, 'W', '', 'g') = regexp_replace(b.namef, 'W', '', 'g')
    and regexp_replace(a.namel, 'W', '', 'g') = regexp_replace(b.namel, 'W', '', 'g')
  

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

Ответ №2:

Если вы хотите удалить только то, что не является буквой, используйте:

 regexp_replace(a.namef, '[^A-Za-z]', '', 'g') = regexp_replace(b.namef, '[^A-Za-z]', '', 'g')
  

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

1. Спасибо и ценю ваше время и ответ. Но это полностью игнорирует все, что не является буквой. Но я могу использовать это для другой цели.