我不知道如何使这个 IF 语句在 Oracle SQL 中工作

问题描述 投票:0回答:1

我正在编写一段代码,其目标是将一个表中的名称与另一个表中的名称进行匹配。然而,两个表中的所有名字都是由来自国家不同地区的多个人给出的,并且有点混乱。例如,一个表中的蓝色灯将写为“02 BLUE LAMP(灯)”或“02 BLMP(灯)”或“02(灯)”,或者在另一表中写为“02 LAMP”或“02 BLUE LAMP)。所以我的代码背后的想法是,首先逐渐比较两个条目,首先按名称(一个大写),然后按类型(一个在括号中)。我已经编写了按全名进行比较的程序。
然而,在某些情况下,有几个项目标记为类型“(灯)”,所以我想首先按数字“(02)”和类型“(灯)”进行比较[使用 IF number = l_number THEN],然后仅按类型进行比较[ELSIF number <> l_number THEN] 因此,两种情况下的条件相同。因此,如果有一个项目的类型为“(灯)”,但数字与其 ID 不匹配,则仍然会匹配,但如果有多个项目的类型为“(灯)”,则只有那些具有相同数字“(02)”和输入“(灯)”:

--above this there is code irrelevant to discussion 
         RETURN l_retval;
           EXCEPTION
           WHEN no_data_found THEN

               BEGIN  
               SELECT
                   ID
               INTO l_retval
               FROM OBJECTS_MV
               WHERE TS_ID = p_ts_id
                    IF number = l_number THEN
                                (upper(number_name) LIKE '%LAMP%' AND upper(l_type) LIKE '%LAMP%') OR
                                (upper(number_name) LIKE '%CHAIR%' AND upper(l_type) LIKE '%CHAIR%') OR
                    ELSIF number <> l_number THEN
                                (upper(number_name) LIKE '%LAMP%' AND upper(l_type) LIKE '%LAMP%') OR
                                (upper(number_name) LIKE '%CHAIR%' AND upper(l_type) LIKE '%CHAIR%') OR
                    END IF;
                    
               RETURN l_retval;
               EXCEPTION
               WHEN no_data_found THEN     
--code continues, but it is irrelevant to discussion 

我的大学告诉我,我已经使用了太多的 SELECT,这显然会减慢网站的速度,因此理想的解决方案只有一个 SELECT。

经过几个小时的思考,我真的不知道如何解决这个问题。我厌倦了在案例中尝试过的不同解决方案,但收效甚微。我得到的唯一错误是该语句没有正确关闭。希望我的解释有意义。

提前致谢

sql if-statement conditional-statements case
1个回答
0
投票

您可以使用

CASE...WHEN
表达式,如下所示:

 WHERE TS_ID = p_ts_id
  and CASE 
         WHEN number = l_number THEN
             CASE WHEN (upper(number_name) LIKE '%LAMP%'  
                        AND upper(l_type) LIKE '%LAMP%'
                       )
                       OR 
                      (upper(number_name) LIKE '%CHAIR%' 
                       AND upper(l_type) LIKE '%CHAIR%') 
                  THEN 1
                  ELSE 0
             END
          ELSE /* number <> l_number */
             CASE WHEN (upper(number_name) LIKE '%LAMP%'  
                        AND upper(l_type) LIKE '%LAMP%'
                       )
                       OR 
                      (upper(number_name) LIKE '%CHAIR%' 
                       AND upper(l_type) LIKE '%CHAIR%') 
                  THEN 1
                  ELSE 0
              END
        END=1

   END

但是你的 THEN 部分与 ELSE..IF..THEN 部分相同,所以我不理解逻辑:你需要使这个语法适应你的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.