如何在cursor中使用CASE语句合并where子句中的条件

时间:2018-02-19 03:52:54

标签: oracle oracle11g

如何在游标中使用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;

2 个答案:

答案 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;

我在table2ANPP)与您查询中的其他表格之间没有看到要加入的列。我认为它应该是交叉连接。如果没有,请为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