我有以下要求在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语句来完成。但不知道如何开始。
非常感谢任何帮助。感谢
答案 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));