You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从SELECT插入临时表返回空表,如何让Id返回NULL替代?

临时表无匹配数据时返回NULL而非空表的实现方案

场景说明

需要将外部传入的ID字符串拆分后,根据主表mod_SHOP_Prodotti的ProdottoAggregato字段值,分别将匹配的ID存入两个临时表;当前问题是当临时表无匹配数据时返回空表,希望改为返回一条Id为NULL的记录。

原实现代码:

CREATE TABLE #TempProdotti (Id int NULL);
CREATE TABLE #TempProdottiAggregati (Id int NULL);
CREATE TABLE #TempCorsiSingoli (Id int NULL);

-- 拆分ID字符串并转换为INT类型存入临时表
INSERT INTO #TempProdotti (Id)
(SELECT CAST(value AS int) AS Id
 FROM string_split('3116,3122,3090', ','));

-- 将匹配的非聚合产品ID存入临时表
INSERT INTO #TempCorsiSingoli (Id)
(SELECT Id
 FROM mod_SHOP_Prodotti
 WHERE Id IN (SELECT Id FROM #TempProdotti)
   AND ProdottoAggregato = 0);

-- 将匹配的聚合产品ID存入临时表
INSERT INTO #TempProdottiAggregati (Id)
(SELECT Id
 FROM mod_SHOP_Prodotti
 WHERE Id IN (SELECT Id FROM #TempProdotti)
   AND ProdottoAggregato = 1);

-- 查询临时表
SELECT *
FROM #TempProdotti;
SELECT *
FROM #TempProdottiAggregati;
SELECT *
FROM #TempCorsiSingoli;

DROP TABLE #TempProdotti;
DROP TABLE #TempProdottiAggregati;
DROP TABLE #TempCorsiSingoli;

简洁解决方案

方案1:修改查询语句,无数据时返回NULL

在查询临时表时,通过UNION ALL结合NOT EXISTS判断表是否为空,为空则追加一条Id为NULL的记录:

CREATE TABLE #TempProdotti (Id int NULL);
CREATE TABLE #TempProdottiAggregati (Id int NULL);
CREATE TABLE #TempCorsiSingoli (Id int NULL);

INSERT INTO #TempProdotti (Id)
(SELECT CAST(value AS int) AS Id
 FROM string_split('3116,3122,3090', ','));

INSERT INTO #TempCorsiSingoli (Id)
(SELECT Id
 FROM mod_SHOP_Prodotti
 WHERE Id IN (SELECT Id FROM #TempProdotti)
   AND ProdottoAggregato = 0);

INSERT INTO #TempProdottiAggregati (Id)
(SELECT Id
 FROM mod_SHOP_Prodotti
 WHERE Id IN (SELECT Id FROM #TempProdotti)
   AND ProdottoAggregato = 1);

-- 原始ID表查询
SELECT * FROM #TempProdotti;

-- 聚合产品表查询:无数据时返回NULL
SELECT Id FROM #TempProdottiAggregati
UNION ALL
SELECT NULL WHERE NOT EXISTS (SELECT 1 FROM #TempProdottiAggregati);

-- 单个课程表查询:无数据时返回NULL
SELECT Id FROM #TempCorsiSingoli
UNION ALL
SELECT NULL WHERE NOT EXISTS (SELECT 1 FROM #TempCorsiSingoli);

DROP TABLE #TempProdotti;
DROP TABLE #TempProdottiAggregati;
DROP TABLE #TempCorsiSingoli;

方案2:简化流程,无需临时表

使用CTE(通用表表达式)直接拆分ID并关联主表,同时处理无匹配的情况,省去临时表的创建和销毁步骤:

WITH SplitIds AS (
    -- 拆分并转换ID字符串
    SELECT CAST(value AS int) AS Id FROM string_split('3116,3122,3090', ',')
)
-- 查询单个课程:无匹配时返回NULL
SELECT s.Id 
FROM SplitIds s
JOIN mod_SHOP_Prodotti p ON s.Id = p.Id
WHERE p.ProdottoAggregato = 0
UNION ALL
SELECT NULL WHERE NOT EXISTS (
    SELECT 1 FROM SplitIds s
    JOIN mod_SHOP_Prodotti p ON s.Id = p.Id
    WHERE p.ProdottoAggregato = 0
);

-- 查询聚合产品:无匹配时返回NULL
SELECT s.Id 
FROM SplitIds s
JOIN mod_SHOP_Prodotti p ON s.Id = p.Id
WHERE p.ProdottoAggregato = 1
UNION ALL
SELECT NULL WHERE NOT EXISTS (
    SELECT 1 FROM SplitIds s
    JOIN mod_SHOP_Prodotti p ON s.Id = p.Id
    WHERE p.ProdottoAggregato = 1
);

-- 可选:查询原始拆分的ID
SELECT * FROM SplitIds;

内容的提问来源于stack exchange,提问作者Matteo Pietro Peru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:20:28