如何在SQL语句中比较修剪后的变量?

时间:2019-01-25 10:32:02

标签: sql oracle oracledb

我有一个包含三个数据库表的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时,该语句将无法正常工作。

2 个答案:

答案 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)而不是强制在数字和字符串之间进行不必要的转换。