SQL 查询获取多条 NULL 记录并插入到目标表中

问题描述 投票:0回答:1

获取指定列中存在空值的列,然后插入到目标表表中。我使用了 case 表达式,但在此问题中,如果它第一个指定列为 NULL,那么它不会检查另一列,而是转到下一行 因此,如果在一行中,我有 7 个指定列中的 3 列为 NULL,那么 case 将仅获取第一个列,但我想获取所有指定的列,并将具有硬编码值的每列插入到目标表的不同行中 我无法使用循环、游标来解决性能问题,因为有超过 1000 万条记录。 通过SQL查询 只需要从源表中获取 L_ID、电话和rec_id。

INSERT INTO TARGET table(DOMAIN, FALLOUT_ID, SEVERITY, BUSINESS_RULE, CHECKED_TABLE, CHECKED_COLUMN, FALLOUT_TYPE, L_ID, TELEPHONE, ADDITIONAL_CONDITION, REC_ID)
SELECT
'AT' AS DOMAIN,
CASE 
WHEN DOMS NULL THEN 'VLD_DOMS' 
WHEN ROMS NULL THEN 'VLD_ROMS'
WHEN COMS IS NULL THEN 'VLD_COMS'
END AS FALLOUT_ID,
'MAJOR' AS SEVERITY,
CASE
WHEN DOMS IS NULL THEN 'DOMS should be not null'
WHEN ROMS IS NULL THEN 'ROMS should be not null'
WHEN COMS IS NULL THEN 'COMS should be not null'
END AS BUSINESS_RULE,
'Source_table' AS CHECKED_TABLE,
CASE
WHEN DOMS IS NULL THEN 'DOMS'
WHEN ROMS IS NULL THEN 'ROMS'
WHEN COMS IS NULL THEN 'COMS'
END AS CHECKED_COLUMN,
'NNL' AS FALLOUT_TYPE,
L_ID,
TELEPHONE,
CASE
WHEN DOMS IS NULL THEN 'DOMS should contain value'
WHEN ROMS IS NULL THEN 'ROMS should contain date'
WHEN COMS IS NULL THEN 'COMS should be not null'
END AS ADDITIONAL_CONDITION,
REC_ID
FROM source table
WHERE DOMS IS NULL
OR ROMS IS NULL
OR COMS IS NULL;

我尝试了 Case 表达式,但它正在检查一列,如果为 true,则不检查其他列并直接转到下一行。

oracle validation
1个回答
0
投票

要实现基于单行中每个 NULL 列插入多条记录,您可以将 UNION ALL 与每个可能为 NULL 的列的单独 SELECT 语句结合使用。这样,您将在目标表中为源表中的每个 NULL 列创建一个单独的行。

以下示例说明了如何修改查询以为每个 NULL 列插入一行:

插入目标表( 域、FALLOUT_ID、严重性、业务规则、检查表、 CHECKED_COLUMN、FALLOUT_TYPE、L_ID、电话、ADDITIONAL_CONDITION、REC_ID ) 选择“AT”作为域,“VLD_DOMS”作为 FALLOUT_ID,“MAJOR”作为严重性, 'DOMS 不应为空' AS BUSINESS_RULE,'source_table' AS CHECKED_TABLE, “DOMS”作为 CHECKED_COLUMN、“NNL”作为 FALLOUT_TYPE、L_ID、电话、 “DOMS 应包含值”AS ADDITIONAL_CONDITION, REC_ID 从源表 DOMS 为空的地方

联合所有

选择“AT”作为域,“VLD_ROMS”作为 FALLOUT_ID,“MAJOR”作为严重性, “ROMS 不应为空”作为 BUSINESS_RULE,“源表”作为 CHECKED_TABLE, “ROMS”作为 CHECKED_COLUMN、“NNL”作为 FALLOUT_TYPE、L_ID、电话、 “ROMS 应包含日期”AS ADDITIONAL_CONDITION, REC_ID 从源表 ROM 为空的地方

联合所有

选择“AT”作为域,“VLD_COMS”作为 FALLOUT_ID,“MAJOR”作为严重性, 'COMS 不应为空' AS BUSINESS_RULE,'source_table' AS CHECKED_TABLE, “COMS”作为 CHECKED_COLUMN、“NNL”作为 FALLOUT_TYPE、L_ID、电话、 'COMS 不应为空' AS ADDITIONAL_CONDITION, REC_ID 从源表 COMS 为空的地方;

此方法使用 UNION ALL 组合三个单独的 SELECT 语句的结果,每个语句检查一列(DOMS、ROMS、COMS)中的 NULL。如果 source_table 中的一行有多个 NULL 列,则将导致目标表中出现多行,每个 NULL 列对应一行。

请注意,UNION ALL 不会删除 select 语句之间的重复行,这正是我们在本例中想要的,因为如果多列为 NULL,源表中的单行可能会导致目标表中的多行。

确保 UNION ALL 操作的性能对于您的数据集大小来说是可以接受的,这一点很重要。由于您提到拥有超过 1000 万条记录,因此请确保您的数据库已正确建立索引,尤其是在检查 NULL 值的列上。这将有助于数据库引擎有效地处理查询。

© www.soinside.com 2019 - 2024. All rights reserved.