Oracle SQL:在'WITH'语句中,如何进行条件选择,使用IF还是CASE?(Oracle SQL: in 'WITH' statement, how to do conditional select, use IF or CASE?)
我有两张桌子:
CREATE TABLE Test_Persons_A ( PersonID int, LastName varchar(255), FirstName varchar(255) ); INSERT INTO Test_Persons_A (PersonID,LastName,FirstName) values(11,'LN_A1','FN_A1'); INSERT INTO Test_Persons_A (PersonID,LastName,FirstName) values(12,'LN_A2','FN_A2'); CREATE TABLE Test_Persons_B ( PersonID int, LastName varchar(255), FirstName varchar(255) ); INSERT INTO Test_Persons_B (PersonID,LastName,FirstName) values(21,'LN_B1','FN_B1'); INSERT INTO Test_Persons_B (PersonID,LastName,FirstName) values(22,'LN_B2','FN_B2'); commit;
但后来我无法弄清楚如何对后面的'WITH'进行条件选择:
------------------------------use IF, not working ------------------------------ var TEST_TBL varchar2(20); exec :TEST_TBL := 'test_person_A'; with Test_tbl as ( IF UPPER(:TEST_TBL) = 'TEST_PERSONS_A' then select * from Test_Persons_A; ELSIF UPPER(:TEST_TBL) = 'TEST_PERSONS_B' then select * from Test_Persons_B; End if; ) select PersonID as PID, LastName as LN, FirstName as FN from Test_tbl tp where tp.LASTNAME like '%1%' ------------------------------use CASE, not working ------------------------------ var TEST_TBL varchar2(20); exec :TEST_TBL := 'test_person_A'; with Test_tbl as ( CASE WHEN UPPER(:TEST_TBL) = 'TEST_PERSONS_A' then select * from Test_Persons_A; ELSE select * from Test_Persons_B; End ) select PersonID as PID, LastName as LN, FirstName as FN from Test_tbl tp where tp.LASTNAME like '%1%';
最终,我能以某种方式推广这个吗? 即在SQL(至少oracle)哪里可以断言条件语句,哪里不能?
I have two tables:
CREATE TABLE Test_Persons_A ( PersonID int, LastName varchar(255), FirstName varchar(255) ); INSERT INTO Test_Persons_A (PersonID,LastName,FirstName) values(11,'LN_A1','FN_A1'); INSERT INTO Test_Persons_A (PersonID,LastName,FirstName) values(12,'LN_A2','FN_A2'); CREATE TABLE Test_Persons_B ( PersonID int, LastName varchar(255), FirstName varchar(255) ); INSERT INTO Test_Persons_B (PersonID,LastName,FirstName) values(21,'LN_B1','FN_B1'); INSERT INTO Test_Persons_B (PersonID,LastName,FirstName) values(22,'LN_B2','FN_B2'); commit;
But then I can't figure out how to do a conditional select for the 'WITH' that follows:
------------------------------use IF, not working ------------------------------ var TEST_TBL varchar2(20); exec :TEST_TBL := 'test_person_A'; with Test_tbl as ( IF UPPER(:TEST_TBL) = 'TEST_PERSONS_A' then select * from Test_Persons_A; ELSIF UPPER(:TEST_TBL) = 'TEST_PERSONS_B' then select * from Test_Persons_B; End if; ) select PersonID as PID, LastName as LN, FirstName as FN from Test_tbl tp where tp.LASTNAME like '%1%' ------------------------------use CASE, not working ------------------------------ var TEST_TBL varchar2(20); exec :TEST_TBL := 'test_person_A'; with Test_tbl as ( CASE WHEN UPPER(:TEST_TBL) = 'TEST_PERSONS_A' then select * from Test_Persons_A; ELSE select * from Test_Persons_B; End ) select PersonID as PID, LastName as LN, FirstName as FN from Test_tbl tp where tp.LASTNAME like '%1%';
And ultimately, can I generalize this somehow? i.e. In SQL (oracle at least) where can I assert conditional statements, and where can't I?
原文:https://stackoverflow.com/questions/51330449
最满意答案
您没有执行任何查询。 您只是将查询字符串分配给返回的结果变量。 我没有尝试编译它,但是这样的事情:
create or replace function update_grade(nm number) return varchar2 as grd varchar2(3); begin SELECT gradeid INTO grd from grade where nm between marks_s and markks_e; return grd; end;
如果没有找到数据,您可以考虑为案例添加处理:
EXCEPTION WHEN NO_DATA_FOUND THEN grd:= NULL;
You are not executing any query. You are just assigning the query string to the returned result variable. I've not tried to compile it, but something like this:
create or replace function update_grade(nm number) return varchar2 as grd varchar2(3); begin SELECT gradeid INTO grd from grade where nm between marks_s and markks_e; return grd; end;
You might consider adding handling for the case when no data is found:
EXCEPTION WHEN NO_DATA_FOUND THEN grd:= NULL;
相关问答
更多-
间隔函数在oracle中(interval function in oracle)[2022-03-09]
INTERVAL不是一个函数,它是一个引入间隔字面值的关键字,而这个表示数据类型 。 类似于文字TIMESTAMP '2011-05-04 17:18:19'或TIMESTAMP '2011-05-04 17:18:19'正在做的事情。 有关区间文字的详细信息 http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements003.htm#SQLRF00221 http://docs.oracle.com/cd/E11882_01/serv ... -
以下是Oracle文档中的一个示例。 基本上你需要dbms_sql.fetch_rows和dbms_sql.column_value : CREATE TABLE multi_tab (num NUMBER, dat1 DATE, var VARCHAR2(24), dat2 DATE) declare c NUMBER; d ...
-
您没有执行任何查询。 您只是将查询字符串分配给返回的结果变量。 我没有尝试编译它,但是这样的事情: create or replace function update_grade(nm number) return varchar2 as grd varchar2(3); begin SELECT gradeid INTO grd from grade where nm between marks_s and markks_e; return grd; ...
-
你已经混淆了你的代码,我怀疑这个过程中隐藏了问题。 我怀疑你的代码更像 create or replace FUNCTION FUNC_FAAL(myNumberColumn number,firstDate date , secondDate date) RETURN INTEGER as rtr integer; BEGIN select count(*) into rtr from my_table tbl where tbl.myDateColumn between fir ...
-
如何使用repalce函数在oracle中从查询中更改字符串(How to use repalce function to change string from query in oracle)[2024-02-13]
您需要在子查询周围放置括号: select replace ((SELECT TO_CHAR(CURRENT_TIMESTAMP) FROM DUAL),CURRENT_TIMESTAMP,'2015-03-10 11:45:15') As result from dual; 但是,写得很糟糕。 您的TO_CHAR(CURRENT_TIMESTAMP)没有格式掩码,这意味着您将时间戳转换为字符串依赖于您的nls设置。 这是不好的做法。 此外,replace语句的第二个参数中的CURRENT_TIMESTA ... -
oracle转义函数(oracle escape function)[2023-02-22]
正如Yahia指出的,您应该始终使用绑定变量而不是动态地动态组装SQL语句。 这是保护自己免受SQL注入攻击的正确方法。 转义字符串提供了更低的保护级别。 话虽如此,假设您使用Oracle 10.1或更高版本,则可以使用q引用语法。 就像是 1 select q'[This is a string with an embedded ']' str 2* from dual SQL> / STR ----------------------------------- This is a str ... -
从Oracle函数返回(Getting return from Oracle function)[2021-02-24]
我之前看过上一篇文章时曾尝试过。 但是,当我编写SQL时,我包含了包装版本,这就是导致异常的原因,即包装的sql。 如果SQL编写如下,它可以完美地工作。 public string UpdateParticipant(ParticipantUpdate Participant) { string ret = ""; IsoDateTimeConverter dt = new IsoDateTimeConverter(); dt.DateTimeFormat = "MM-dd-yyy ... -
在oracle中使用函数(using between function in oracle)[2021-08-17]
字符串比较基于字母顺序。 字符串M9W在M9W0A0和M9W9Z9之间不是按字母顺序排列的。 按字母顺序排在两者之前。 按字母顺序,它出现在任何字符串M9W<> 。 String comparison is based on alphabetical order. The string M9W is not alphabetically between M9W0A0 and M9W9Z9. Alphabetically, it comes before both ... -
您可以EXECUTE IMMEDIATE INTO变量并在条件语句中使用它。 下面的示例是一个函数,其输入是SELECT COUNT(*)类型的查询字符串,如果计数> 0,则其输出为TRUE 。 首先创建一个测试表: CREATE TABLE MYTABLE(X NUMBER); INSERT INTO MYTABLE VALUES (1); 然后创建包: CREATE PACKAGE MYPACKAGE AS FUNCTION DOES_IT_EXIST(QUERY_STRING IN VARCHA ...
-
您的函数返回一个sys_refcursor并在您的代码中返回一个simple cursor 。 这使代码错误。 如果要从函数返回ref_cursor ,可以使用如下: create or replace function stuff (p_var number) return sys_refcursor is rf_cur sys_refcursor; begin open rf_cur for select * from employee w ...