如果列至少有一个值为空或未找到任何外键列值的数据,如何返回 TRUE?尝试在互联网上搜索答案,但找不到任何与此组合有关的答案。因此把它贴在这里。
以下是数据:表名 - MY_EMP
+----+------------+-----------+---------------------------+--------+
| id | first_name | last_name | email | fk_col |
+----+------------+-----------+---------------------------+--------+
| 1 | Hurleigh | Stove | | 1 |
| 2 | Joline | | | 1 |
| 3 | Martynne | Honatsch | [email protected] | 2 |
| 4 | Willyt | Fullylove | [email protected] | 2 |
| 5 | Joelly | | [email protected] | 3 |
+----+------------+-----------+---------------------------+--------+
尝试编写函数并正在测试代码。这是进入函数的代码:
DECLARE
v_verify NUMBER(2);
BEGIN
SELECT DISTINCT 1
INTO v_verify
FROM my_emp
WHERE ( last_name IS NULL
OR email IS NULL )
AND fk_col = :custom_fk;
dbms_output.Put_line('Return True');
EXCEPTION
WHEN no_data_found THEN
dbms_output.Put_line('Return False');
END;
当参数 :custom_fk = 1 则值返回 TRUE(这是正确的)
当参数 :custom_fk = 2 则值返回 FALSE(这是正确的)
当参数 :custom_fk = 700 则值返回 FALSE(根据我的要求不正确)--这里我希望 value 返回 true 并且无法弄清楚如何调整代码以符合我的要求。
希望我在这里得到一些帮助。
下面是创建表和插入数据的代码:
/* CREATE TABLE */
CREATE TABLE MY_EMP(
id NUMBER(5) NOT NULL,
first_name VARCHAR2(100) NOT NULL,
last_name VARCHAR2(100),
email VARCHAR2(100),
fk_col NUMBER(5),
CONSTRAINT "MY_EMP_PK" PRIMARY KEY ("ID")
);
/*Insert data*/
INSERT INTO my_emp(id, first_name, last_name, email, fk_col)
VALUES(1, 'Hurleigh', 'Stove', '', 1);
INSERT INTO my_emp(id, first_name, last_name, email, fk_col)
VALUES(2, 'Joline', '', '', 1);
INSERT INTO my_emp(id, first_name, last_name, email, fk_col)
VALUES(3, 'Martynne', 'Honatsch', '[email protected]', 2);
INSERT INTO my_emp(id, first_name, last_name, email, fk_col)
VALUES(4, 'Willyt', 'Fullylove', '[email protected]', 2);
INSERT INTO my_emp(id, first_name, last_name, email, fk_col)
VALUES(5, 'Joelly', '', '[email protected]', 3);
谢谢,
里查
这行吗?
SQL> with temp as
2 (select count(*) cnt
3 from (select distinct 1 as val
4 from my_emp
5 where fk_col = &&par_fk_col
6 and ( last_name is null
7 or email is null
8 )
9 union all
10 select distinct 2
11 from my_emp
12 where fk_col = &&par_fk_col
13 )
14 )
15 select case when cnt = 1 then 'false'
16 else 'true'
17 end as result
18 from temp;
它导致
Enter value for par_fk_col: 1
RESUL
-----
true
SQL> undefine par_fk_col
SQL> /
Enter value for par_fk_col: 2
RESUL
-----
false
SQL> undefine par_fk_col
SQL> /
Enter value for par_fk_col: 3
RESUL
-----
true
SQL> undefine par_fk_col
SQL> /
Enter value for par_fk_col: 700
RESUL
-----
true
SQL>
这一切都在一份select
声明中。如果您正在编写函数,检查是否fk_col
存在于单独的查询中可能更简单;如果没有,请true
立即返回。如果是这样,则检查其他条件。
(顺便说一句,感谢您提供测试用例。这种情况非常罕见,我感到非常惊讶!)
[编辑]将该语句“转换”为 PL/SQL 并不困难。我建议使用函数而不是匿名 PL/SQL 块。
SQL> create or replace function f_test (par_fk_col in my_emp.fk_col%type)
2 return varchar2
3 is
4 retval varchar2(10);
5 begin
6 with temp as
7 (select count(*) cnt
8 from (select distinct 1 as val
9 from my_emp
10 where fk_col = par_fk_col
11 and ( last_name is null
12 or email is null
13 )
14 union all
15 select distinct 2
16 from my_emp
17 where fk_col = par_fk_col
18 )
19 )
20 select case when cnt = 1 then 'false'
21 else 'true'
22 end
23 into retval
24 from temp;
25
26 return retval;
27 end;
28 /
Function created.
测试:
SQL> select f_test(1) from dual;
F_TEST(1)
---------------------------------------
true
SQL> select f_test(2) from dual;
F_TEST(2)
---------------------------------------
false
SQL> select f_test(700) from dual;
F_TEST(700)
---------------------------------------
true
SQL>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句