Oracle SQL присоединяется с использованием like и приведение к varchar2 - PullRequest
0 голосов
/ 16 мая 2019

Мне нужно join несколько таблиц. В одном из столбцов есть диакритические знаки (например, áíé ...), но во втором нет диакритических знаков, а в некоторых записях есть постфикс. Допустим,

Table A:                               Table B:

code  |  name  |  surname              name     |  username
-------------------------              --------------------
1234  |  John  |  Doé                  Doe      |  Doe
5678  |  Jane  |  Smith                Doe      |  DoeJ
9012  |  Tom   |  Novák                Dean Doe |  DoeD

Мне нужно join этих двух таблиц на surname и username, и мне нужно показать все записи из таблицы B, которые могут совпадать с записями из таблицы A. И у меня есть список конкретных code из таблицы А. Так что мой select должен возвращать что-то вроде этого, если мой список кодов будет только 1234:

A.name  |  A.surname  |  B.username
-----------------------------------
John    |  Doé        |  Doe
John    |  Doé        |  DoeJ
John    |  Doé        |  DoeD

Теперь у меня есть это select:

select A.name, A.surname, B.username
  from (select column_value as code
    from SYS.ODCIVARCHAR2LIST('1234', '5678', '9012', '3456')) t
right join tableA A on t.code = A.code
join tableB B
  on replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(p.prijmeni, 'Ě', 'E'), 'Š', 'S'), 'Č', 'C'), 'Ř', 'R'), 'Ž', 'Z'), 'Ý', 'Y'), 'Á', 'A'), 'Í', 'I'), 'É', 'E'), 'Ú', 'U'), 'Ů', 'U'), 'Ď', 'D'), 'Ň', 'N'), 'Ó', 'O'), 'Ť', 'T')
    like (B.username || '%')
where t.code is not null;

И в результате получается только одна запись:

A.name  |  A.surname  |  B.username
-----------------------------------
John    |  Doé        |  Doe

Когда я удаляю (комментирую) предложение t.code is not null в where, я получаю частично правильный результат:

A.name  |  A.surname  |  B.username
-----------------------------------
John    |  Doé        |  Doe
null    |  null       |  DoeJ
null    |  null       |  DoeD

Но в таблице B есть сотни записей, которые мне не нужны в моем результате.

Кто-нибудь может мне помочь? Я знаю, что концепция неверна, но это не моя работа, и мне нужно исправить это сейчас.

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Используйте

on B.username LIKE utl_raw.cast_to_varchar2(nlssort(A.surname, 'nls_sort=binary_ai'))

в вашем состоянии соединения. Вызов nlssort преобразует акцентированные символы в их лингвистические основы и игнорирует регистр в сравнениях.

0 голосов
/ 16 мая 2019

Вы добавляете «%» в неправильную сторону, это должно работать:

select A.name, A.surname, B.username
  from (select column_value as code
    from SYS.ODCIVARCHAR2LIST('1234', '5678', '9012', '3456')) t
right join tableA A on t.code = A.code
join tableB B
  on B.username
  LIKE replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(p.prijmeni, 'Ě', 'E'), 'Š', 'S'), 'Č', 'C'), 'Ř', 'R'), 'Ž', 'Z'), 'Ý', 'Y'), 'Á', 'A'), 'Í', 'I'), 'É', 'E'), 'Ú', 'U'), 'Ů', 'U'), 'Ď', 'D'), 'Ň', 'N'), 'Ó', 'O'), 'Ť', 'T') || '%'
where t.code is not null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...