我正在编写一段代码,其目标是将一个表中的名称与另一个表中的名称进行匹配。然而,两个表中的所有名字都是由来自国家不同地区的多个人给出的,并且有点混乱。例如,一个表中的蓝色灯将写为“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。
经过几个小时的思考,我真的不知道如何解决这个问题。我厌倦了在案例中尝试过的不同解决方案,但收效甚微。我得到的唯一错误是该语句没有正确关闭。希望我的解释有意义。
提前致谢
您可以使用
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 部分相同,所以我不理解逻辑:你需要使这个语法适应你的逻辑。