web-dev-qa-db-ja.com

WHERE句でIF ... ELSE条件を使用するにはどうすればよいですか?

WHERE句でIF ... ELSE構文を使用して、SELECTに条件を選択的に適用しようとしています。

これでうまくいくでしょうか?

CREATE OR REPLACE package body If_Else_Pack IS

    PROCEDURE Moving
    (
        obj_A       IN varchar2,
        obj_B       IN varchar2,
        obj_C       IN varchar2,
        obj_D       IN varchar2,
        cur_Result  OUT T_CURSOR
    ) IS
    BEGIN
        OPEN cur_Result FOR
        SELECT 
            w.assetid,
            w.vehiclenumber,
            w.LatLong,
            w.CurrentSpeed,
            w.timeOfMovement,
            w.CurrentPlace,
            w.curTime,
            w.motion,
            w.fuelR,
            w.VehicleStart
        FROM waypoints1 w
        WHERE 
            IF ((obj_D= '0' OR obj_D IS NULL) AND (obj_C= '0' OR  obj_C IS NULL)) THEN
                WHERE w.customer_id =obj_A
                AND w.delegate_user_id = obj_B;
            ELSE IF ((obj_D= '0 'OR obj_D IS NULL) AND (obj_C<> '0' OR obj_C IS NOT NULL)) THEN
                WHERE w.customer_id = obj_A
                AND w.category_id = obj_C
                AND w.delegate_user_id = obj_B;
            ELSE IF ((obj_D<> '0' OR obj_Dis NOT NULL) AND(obj_C= '0' OR obj_C IS NULL)) THEN
                WHERE w.customer_id = obj_A
                AND w.fleet_id = obj_D
                AND w.delegate_user_id = obj_B;
    END MOVING;
END IF_ELSE_PACK;
5
Vasu

質問は少し誤解を招くものであり、人々が正しく考えない原因になると思います。 3つの条件が重複しないように見えるので、3つのステートメントを一緒にORするだけです。

create or replace package body If_Else_Pack is

  Procedure Moving(obj_A IN varchar2,
                   obj_B  IN varchar2,
                   obj_C IN varchar2,
                   obj_D    IN varchar2,
                   cur_Result     OUT T_CURSOR) is

   begin

        open cur_Result for
        select w.assetid,
                 w.vehiclenumber,
                 w.LatLong,
                 w.CurrentSpeed,
                 w.timeOfMovement,
                 w.CurrentPlace,
                 w.curTime,
                 w.motion,
                 w.fuelR,
                 w.VehicleStart
        from waypoints1 w
        where 
        (((obj_D= '0' or obj_D is null) and (obj_C= '0' oR  obj_C is null)) 
                 and w.customer_id =obj_A
                 and w.delegate_user_id = obj_B)
        or
        (((obj_D= '0 'or obj_D is null) and (obj_C<> '0' or obj_C is not null)) 
           and w.customer_id = obj_A 
           and w.category_id = obj_C 
           and w.delegate_user_id = obj_B)
        or
        (((obj_D<> '0' or obj_D is not null) and (obj_C= '0' or obj_C is null))
           and w.customer_id = obj_A
           and w.fleet_id = obj_D
           and w.delegate_user_id = obj_B);
END MOVING;
END IF_ELSE_PACK;

WHERE条件は、次のようにさらに簡略化できます。

        WHERE 
              w.customer_id = obj_A
          AND 
              w.delegate_user_id = obj_B
          AND 
              ( (obj_D = '0' or obj_D IS NULL) AND (obj_C= '0' OR obj_C IS NULL) 
             OR 
                (obj_D = '0' or obj_D IS NULL) AND (w.category_id = obj_C) 
             OR 
                (w.fleet_id = obj_D) AND (obj_C= '0' OR obj_C IS NULL) 
              ) ;
6
Philᵀᴹ

CASE構文 を調べる必要があります。エイドリアンの記事は非常に役に立ちます。 Oracleのドキュメントは here です。

実行したい種類のクエリでは、データベーススキーマにいくつかの欠落があると思いますが、nullが許可されないように、obj_Cとobj_Dにいくつかの制約を追加できますか?これは物事を簡素化します。

1
kevinsky