Как сравнить усеченную переменную в операторе SQL? - PullRequest
0 голосов
/ 25 января 2019

У меня есть оператор SQL, который включает три таблицы базы данных.Я сравниваю некоторые идентификаторы и ОПИСАНИЯ, и теперь мне нужно сравнить результаты FIRSTNAME, MIDDLENAME и SURNAME.

SELECT UGOVARATELJ_OSIGURANJA AS ULJEZ FROM INS_RAZNO.TEST_DOWNJONES 
WHERE UGOVARATELJ_OSIGURANJA IN 
(SELECT  FIRSTNAME||' '||MIDDLENAME||' '||SURNAME 
AS IME_PREZIME 
FROM (SELECT FIRSTNAME, MIDDLENAME, SURNAME 
FROM INS_RAZNO.AML_CTF
WHERE ID IN (SELECT ID FROM INS_RAZNO.AML_CTF_DESCRIPTIONS 
WHERE DESCRIPTION1='1' OR DESCRIPTION1='2')));

Переменная UGOVARATELJ_OSIGURANJA фактически является именем клиента в форме NAME MIDDNAME SURNAME с пробелами между каждой частью имени.Моя идея состояла в том, чтобы удалить эти пробелы с помощью REMOVE(), но когда я сравниваю после этого со второй таблицей, нет правильного результата.

Я попытался проверить свое утверждение следующим образом: ЭТО ТОЛЬКО ЗАЯВЛЕНИЕ НА ТЕСТ *

SELECT REPLACE(UGOVARATELJ_OSIGURANJA, ' ','') AS ULJEZ FROM 
INS_RAZNO.TEST_DOWNJONES WHERE UGOVARATELJ_OSIGURANJA LIKE '%IVAN F%'

Обратите внимание, что я должен был установить пробел между именем и отчеством LIKE %IVAN F%, и правильный путь был бы% IVANF%.

Есть идеи, как решить эту проблему?Заранее спасибо

РЕДАКТИРОВАТЬ: я делаю это замены (обрезка), потому что некоторые из peops в моих списках не имеют MIDDLENAME

EDIT: это рабочий оператор для имен, которые имеют MIDDLENAME.Оператор не работает должным образом, когда у кого-то нет MIDDLENAME из-за слишком большого пробела.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Это рабочий оператор для имен с MIDDLENAME. Оператор не работает должным образом, когда у кого-то нет MIDDLENAME из-за слишком большого пробела.

Вы можете сделать дополнительное пространство условным:

SELECT UGOVARATELJ_OSIGURANJA AS ULJEZ FROM INS_RAZNO.TEST_DOWNJONES 
WHERE UGOVARATELJ_OSIGURANJA IN 
(SELECT  FIRSTNAME||
   -- only add a space before middlename if it has a value
   CASE WHEN MIDDLENAME IS NOT NULL THEN ' ' END
   ||MIDDLENAME||' '||SURNAME 
AS IME_PREZIME 
FROM (SELECT FIRSTNAME, MIDDLENAME, SURNAME 
FROM INS_RAZNO.AML_CTF
WHERE ID IN (SELECT ID FROM INS_RAZNO.AML_CTF_DESCRIPTIONS 
WHERE DESCRIPTION1='1' OR DESCRIPTION1='2')));

Это исключит возможность ложных совпадений при удалении пробелов.

Вы можете немного упростить это, удалив один ненужный уровень подзапроса:

SELECT UGOVARATELJ_OSIGURANJA AS ULJEZ
FROM INS_RAZNO.TEST_DOWNJONES 
WHERE UGOVARATELJ_OSIGURANJA IN (
  SELECT  FIRSTNAME||
    CASE WHEN MIDDLENAME IS NOT NULL THEN ' ' END||MIDDLENAME
    ||' '||SURNAME
  FROM INS_RAZNO.AML_CTF
  WHERE ID IN (
    SELECT ID
    FROM INS_RAZNO.AML_CTF_DESCRIPTIONS 
    WHERE DESCRIPTION1='1' OR DESCRIPTION1='2'
  )
);

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

SELECT TD.UGOVARATELJ_OSIGURANJA AS ULJEZ
FROM INS_RAZNO.AML_CTF_DESCRIPTIONS ACD
JOIN INS_RAZNO.AML_CTF AC ON AC.ID = ACD.ID
JOIN INS_RAZNO.TEST_DOWNJONES TD
ON TD.UGOVARATELJ_OSIGURANJ = AC.FIRSTNAME
  ||CASE WHEN AC.MIDDLENAME IS NOT NULL THEN ' ' END||AC.MIDDLENAME
  ||' '||AC.SURNAME
WHERE ACD.DESCRIPTION1 IN ('1', '2');

Также проверьте тип данных DESCRIPTION1 - если это действительно число, то вам следует использовать ACD.DESCRIPTION1 IN (1, 2) вместо принудительного ненужного преобразования между числом и строкой.

0 голосов
/ 25 января 2019

Попробуйте выполнить следующее:

Замените пробел "% IVAN F%" на "%"

SELECT REPLACE(UGOVARATELJ_OSIGURANJA, ' ','') AS ULJEZ 
FROM INS_RAZNO.TEST_DOWNJONES 
WHERE REPLACE(UGOVARATELJ_OSIGURANJA, ' ','') LIKE '%IVAN%F%'
...