SQL выражение для возврата строк, где строки с разделителями не совпадают - PullRequest
1 голос
/ 20 марта 2020

Мне нужно написать выражение SQL в большом запросе, которое будет возвращать строки, в которых указанный язык Column_A не соответствует указанному языку Column_B. Оба столбца содержат строки.

  • Два возможных языка: английский / английский или французский / французский.
  • Я не могу ожидать единого соглашения об именах, заглавных букв, и оно может появиться в начале или конце строки.
  • Но я могу ожидать такой разделитель, как _, -, или ().
  • Наконец, столбцы A и B могут иметь разные форматы или разделители друг от друга.

Пока что лучшее решение, которое у меня есть, - это использовать LIKE для каждой возможной перестановки. Но должен быть лучший способ сделать это.

Кто-нибудь может мне помочь?

SELECT
  Column_A,
  Column_B,
FROM
  `xxxxxxxxxxxxxxx`
WHERE
  (Column_A LIKE "%\\_EN\\_%" AND Column_B LIKE "%FR\\_%")
  OR 
  (Column_A LIKE "%\\_en\\_%" AND Column_B LIKE "%fr\\_%")
  OR 
  (Column_A LIKE "%\\(EN\\)%" AND Column_B LIKE "%\\(FR\\)%")
  [...]

1 Ответ

0 голосов
/ 20 марта 2020

Вы можете использовать ссылку REGEX_CONTAINS

здесь: https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators#regexp_contains

здесь вы можете попробовать регулярное выражение

where ((REGEX_CONTAINS(upper(Column_A),r"[E][N][A-z ]+[.\\()-\/][E][N]") and not(REGEX_CONTAINS(upper(Column_B),r"[E][N][A-z ]+[.\\()-\/][E][N]")))
    or (REGEX_CONTAINS(upper(Column_A),r"[F][R][A-z ]+[.\\()-\/][F][R]") and not(REGEX_CONTAINS(upper(Column_B),r"[F][R][A-z ]+[.\\()-\/][F][R]"))))

здесь хороший инструмент для создания и тестирования ваших регулярных выражений: https://regexr.com/

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

where ((not(REGEX_CONTAINS(upper(Column_A),r"[E][N][A-z ]+[.\\()-\/][E][N]")) and not(REGEX_CONTAINS(upper(Column_A),r"[E][N][A-z ]+[.\\()-\/][E][N]")))
    or (not(REGEX_CONTAINS(upper(Column_B),r"[F][R][A-z ]+[.\\()-\/][F][R]")) and not(REGEX_CONTAINS(upper(Column_B),r"[F][R][A-z ]+[.\\()-\/][F][R]"))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...