SQL查询与where子句中的解码和比较

时间:2014-07-07 19:05:24

标签: sql oracle

我有以下要求在oracle中编写查询。

我需要根据两个动态值V1和V2从表T1(它有两个日期列D1和D2)中获取所有记录。这些V1和V2是从应用程序动态传递的。 V1的可能值是'小于'或者'大于'。 V2的可能值是整数。

查询我需要写:

如果V1被传递为'小于'并且V2作为5传递,然后我需要返回T1 WHERE D1-D2中的所有行< 5。

如果V1通过'大于'和V2传递为8,然后我需要返回T1 WHERE D1-D2>中的所有行。 8;

我可以认为这可以使用where子句中的CASE语句来完成。但不知道如何开始。

非常感谢任何帮助。感谢

3 个答案:

答案 0 :(得分:3)

您可以将其写为:

select *
from t1
where (v1 = 'Less Than' and D1 - D2 < v2) or
      (v1 = 'Greater Than' and D1 - D2 > v2)

不需要case声明。

答案 1 :(得分:1)

试试这个:

select *
from T1
where case when V1 = 'LESS THAN' THEN D1 - D2 < V2 ELSE D1 - D2 > V2

假设V1不小于唯一的其他值大于。如果有必要,您可以使用多个案例陈述,但这应该可以帮助您开始。

答案 2 :(得分:0)

PL/SQL解决方案,直接,但可以自定义用于复杂逻辑!

创建嵌套表sql对象

    CREATE TYPE MY_RECORD_TYPE IS OBJECT
    ( 
      D1 VARCHAR2(100),
      D2 VARCHAR2(100),
      D3 VARCHAR2(100),
      D4 VARCHAR2(100)
    );
    /

    CREATE TYPE MY_TABLE_TYPE IS TABLE OF MY_RECORD_TYPE;
    /

这是返回嵌套表格的函数。

   create or replace function check_me(v1 varchar2,v2 number)
    return MY_TABLE_TYPE
    is
    v_query varchar2(4000);
    my_cur sys_refcursor;

    v_record MYTABLE%ROWTYPE; -- Create a local record of table's row type

    v_nested MY_TABLE_TYPE := MY_TABLE_TYPE();

    I NUMBER;
    begin
     v_query := 'SELECT * FROM MYTABLE WHERE D1 - D2 ';
     IF( UPPER(v1) = UPPER('Less Than')) THEN
       v_query := v_query||' > :V2';
     ELSE
       v_query := v_query||' < :V2';
     END IF;

     DBMS_OUTPUT.PUT_LINE(v_query);
     OPEN my_cur FOR v_query USING V2;

     I:=0;
     LOOP
       FETCH my_cur INTO v_record;
       EXIT WHEN my_cur%NOTFOUND;

       v_nested.EXTEND(1);
       I := I + 1;

       /* Copy it into the nested table - Painful!!*/ 
       v_nested(I) := MY_RECORD_TYPE(
                                      v_record.D1,
                                      v_record.d2,
                                      v_record.D3,
                                      v_record.D4
                                     ); 
      END LOOP;

    CLOSE my_cur;--CLose the cursor
    return v_nested;--return the nested table
    end;
    /

你可以运行,

select * FROM TABLE(check_me(',',5));