Oracle PL/SQL:如果列至少有“一个空值”或“未找到数据”,则返回 true

理查

如果列至少有一个值为空或未找到任何外键列值的数据,如何返回 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 |
+----+------------+-----------+---------------------------+--------+
  • 如果任何 fk_col 的 last_name 为空或 email 为空,则返回 true
  • 如果 last_name 为 null 或 email 为无效 fk_col 为 null,则返回 true
  • 否则返回假

尝试编写函数并正在测试代码。这是进入函数的代码:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果python中的二维数组至少有一个True,如何返回True

如果所有值均为False,则为True;如果至少有一个True值python,则为False

Pandas-创建一个二进制列,如果两个不同列中至少有一个存在True,则返回True

如何在php中使用in_array和数组作为指针,但是当至少有一个值匹配时返回true

查找逻辑矩阵的每一行是否至少有一个TRUE

搜索数组中至少有1个匹配项并返回true

如果列中至少有一个特定值,则删除所有行

如果至少有一个元素匹配,则返回所有数组

MS SQL 在整列中查找一个值,如果找到则返回 true

MS SQL 在整列中查找一个值,如果找到则返回 true

Oracle SQL-返回行,其中当前月份的组中至少有一行,并且上个月的类发生了变化

查找并返回至少有一个np.inf值的Pandas数据框的行

Excel-如果两个列中都存在一个值,则返回“ true”

展平一个长数据集,如果至少有一个非缺失值,则插入一个指标

如果不是true(!true)

Oracle更新查询将两个值中的一个值设置为true,即使传递false也是如此

是否有任何逻辑可以找到连续至少有一个真

如果至少有一个学生参加,则查找班上的所有学生

Liquibase忽略了Oracle DB的autoIncrement =“ true”

如果找到节点,则返回True

返回一个共享一个值并且至少有一个与另一个条件匹配的行

如何在 Gremlin 中找到至少有一个单向链接的顶点?

Eloquent Get Collection 如果它至少有一个关系

如果行中至少有一个 Na,则使行 Na

如果它是第一个非空数组,则返回true

mongodb中至少有一个

如何使用Laravel Query Builder选择一个范围内至少有多列的数据?

熊猫-过滤组中至少有一列包含非空值的组

如果任何一个 observables 在未知数量的 observables 中返回 true,如何返回 true