Oracle SQL - 根据 CASE 表达式结果实现逻辑

Oracle SQL - implement logic based on CASE expression result

我有以下查询,其中 returns 我在任何列中至少有一个 NULL 的行的百分比:

SELECT
(SUM(CASE WHEN tablea.test IS NULL OR tableb.test IS NULL THEN 1 ELSE NULL END)/7000)*100) "at least one NULL (%)"
FROM tablea
FULL OUTER JOIN tableb
ON
tablea.test = tableb.test
WHERE ROWNUM < 7000;

查询对我来说工作正常,我得到了有效的结果。

但我需要根据 SELECT 语句中计算的百分比在 tablec 中执行进一步的操作。如果 NULL 行的百分比低于 30%,我需要在 table“tablec”列“resultcol”中插入“YES”字符串,我该如何实现这样的逻辑?

例如,是否可以将 SELECT 语句结果存储在某个临时变量中,该变量将在另一个 SQL 查询中使用?

您可以使用:

INSERT INTO tablec (resultcol)
SELECT 'YES'
FROM   tablea
       FULL OUTER JOIN tableb
       ON tablea.test = tableb.test
WHERE  ROWNUM < 7000
HAVING COUNT(CASE WHEN tablea.test IS NULL OR tableb.test IS NULL THEN 1 END) 
        < COUNT(*) * 0.3;

db<>fiddle here


更新:

如果要插入不存在的行或更改存在的行,则:

MERGE INTO tablec dst
USING (
  SELECT CASE
         WHEN EXISTS (
                SELECT 1
                FROM   tablea
                       FULL OUTER JOIN tableb
                       ON tablea.test = tableb.test
                WHERE  ROWNUM < 7000
                HAVING COUNT(CASE WHEN tablea.test IS NULL OR tableb.test IS NULL THEN 1 END) 
                         < COUNT(*) * 0.3
              )
         THEN 'YES'
         ELSE 'NO'
         END AS resultcol
  FROM   DUAL
) src
ON (1 = 1)
WHEN NOT MATCHED THEN
  INSERT (resultcol) VALUES (src.resultcol)
WHEN MATCHED THEN
  UPDATE SET resultcol = src.resultcol;

或者,仅更新它:

UPDATE tablec
SET resultcol = CASE
                WHEN EXISTS (
                       SELECT 1
                       FROM   tablea
                              FULL OUTER JOIN tableb
                              ON tablea.test = tableb.test
                       WHERE  ROWNUM < 7000
                       HAVING COUNT(
                                CASE
                                WHEN tablea.test IS NULL
                                OR   tableb.test IS NULL
                                THEN 1
                                END
                              ) < COUNT(*) * 0.3
                     )
                THEN 'YES'
                ELSE 'NO'
                END;

db<>fiddle here