如何在游标中使用CASE语句在where子句中合并条件。我在declare语句中定义了V_CATEGORY=11
。因此,根据定义的类别,它必须采取where条件。
DECLARE
V_NODE_ID VARCHAR2(20);
V_CATEGORY VARCHAR2(20) :=11;
CURSOR C1 IS
SELECT isbn FROM GT_ADD_ISBNS GT;
CURSOR C2(v_isbn in varchar2) IS
SELECT ANP.NODE_ID NODE_ID
FROM TABLE1 ANP,
TABLE2 ANPP,
TABLE3 AN
WHERE ANP.NODE_ID=AN.ID AND
CASE WHEN V_CATEGORY =11 THEN
ANP.STRING_VALUE ='pdf' AND
ANPP.STRING_VALUE ='product' AND
CASE WHEN V_CATEGORY =10 THEN
ANP.STRING_VALUE ='IMAGE' AND
ANPP.STRING_VALUE ='product11' AND
END CASE
ANP.TAME_ID=21 AND
ANP.NODE_ID=v_isbn;
BEGIN
--Iterating all Products
FOR R1 IN C1
LOOP
BEGIN
--To check whether Product is exists or not
SELECT AN.ID INTO V_NODE_ID
FROM TABLE1 AN,
TABLE2 ANP
WHERE AN.ID=ANP.NODE_ID
AND ANP.STRING_VALUE in(R1.ISBN);
FOR R2 IN C2(R1.ISBN)
LOOP
....
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('PRODUCT NOT FOUND.....'|| R1.ISBN);
END;
END LOOP;--looping gt_isbns
END;
答案 0 :(得分:0)
对JOIN ON
使用正确的tablea, tableb
语法而不是过时的JOINS
语法。您的游标查询等同于
CURSOR C2(v_isbn in varchar2) IS
SELECT anp.node_id node_id
FROM table1 anp
INNER JOIN table3 an ON anp.node_id = an.id
CROSS JOIN table2 anpp
WHERE (
CASE
WHEN v_category = 11
AND anp.string_value = 'pdf'
AND anpp.string_value = 'product'
THEN 1
WHEN v_category = 10
AND anp.string_value = 'IMAGE'
AND anpp.string_value = 'product11'
THEN 1
ELSE 0
END
) = 1
AND anp.tame_id = 21
AND anp.node_id = v_isbn;
我在table2
(ANPP
)与您查询中的其他表格之间没有看到要加入的列。我认为它应该是交叉连接。如果没有,请为ANPP
包含其他表格的正确加入条件,并移除CROSS
关键字。
答案 1 :(得分:0)
RestaurantFood:with(['foodDetail'=>function($q){
$q->where('type',0);}])->where('id',$id)->get();
子句 - 表示SQL语言(游标在PL / SQL块中定义,但游标定义是纯SQL WHERE
语句)。 SELECT
语句仅在PL / SQL中有效;普通SQL没有CASE
语句,只有CASE
个表达式。
你没有告诉我们代码应该做什么,所以我甚至都不会阅读所有内容(如果不知道它应该做什么,就无法知道它是否正确)。但是,我理解您的尝试意味着什么(无论您是否想要它),我可以向您展示如何在CASE
子句中实现相同目的。
看来,如果WHERE
,您想要v_category = 11
;但如果anp.string_value = 'pdf' and annp.string_value = 'product'
您想要不同的值。而且,重要的是,你并没有告诉我们当v_category = 10
既不是11也不是10时(特别是如果它为空)应该发生什么。因此,您必须编辑代码,以便在这些情况下做正确的事情。
在任何情况下 - v_category
子句可能如下所示:
WHERE