我有一个包含三个数据库表的SQL语句。我正在比较一些ID和描述,现在需要比较结果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%'
请注意,我必须在name和middname LIKE %IVAN F%
之间设置空格,正确的方式应该是%IVANF%。
任何想法如何解决这个问题?预先感谢
编辑:我正在执行此替换(修剪),因为列表中的某些人没有MIDDLENAME
编辑: 这是具有MIDDLENAME的名称的有效声明。 当某人由于空格过多而没有MIDDLENAME时,该语句将无法正常工作。
答案 0 :(得分:1)
尝试关注
将空格'%IVAN F%'替换为'%'
SELECT REPLACE(UGOVARATELJ_OSIGURANJA, ' ','') AS ULJEZ
FROM INS_RAZNO.TEST_DOWNJONES
WHERE REPLACE(UGOVARATELJ_OSIGURANJA, ' ','') LIKE '%IVAN%F%'
答案 1 :(得分:1)
这是具有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)
而不是强制在数字和字符串之间进行不必要的转换。