TSQL:使用大小写用项目填充字符串列表
TSQL : Using case to fill a string list with items
我正在尝试使用插入中的案例创建一些逻辑
这是我正在使用的代码,但无法编译
INSERT INTO @MyList VALUES
(CASE @pCodTraitement
WHEN 'CGPFDG' then '0220'
WHEN 'CGPPS' then '5275'
WHEN 'CGPFP' then '5276'
WHEN 'CGPGC' then '5277', '0220'
ELSE '0241'
END )
解决方案 '''5277'''+','+'''0220''' 无效
我需要满足第 4 个条件,就像项目而不是文本一样,因为我想在
之后使用它
我不想将其作为文本块
因为我会浏览它的项目
...
SELECT *
FROM MyTable
WHERE MyColumn IN (SELECT Value FROM @MyList)
...
由于您需要在其中一个条件下插入多个值,并且 CASE
到 return 多个值不可能以这种方式插入,因此您需要中断操作分开并做类似
的事情
IF @pCodTraitement = 'CGPGC'
BEGIN
INSERT INTO @MyList
VALUES ('5277'), ('0220');
END ELSE
BEGIN
INSERT INTO @MyList VALUES
(CASE @pCodTraitement
WHEN 'CGPFDG' then '0220'
WHEN 'CGPPS' then '5275'
WHEN 'CGPFP' then '5276'
ELSE '0241'
END )
END
这里是猜测,但可能是以下解决方案之一:
INSERT INTO @MyList (ColumName)
SELECT SS.[value]
FROM (VALUES(CASE @pCodTraitement WHEN 'CGPFDG' THEN '0220'
WHEN 'CGPPS' THEN '5275'
WHEN 'CGPFP' THEN '5276'
WHEN 'CGPGC' THEN '5277,0220'
ELSE '0241'
END))V(S)
CROSS APPLY STRING_SPLIT(V.S,',') SS;
DECLARE @Values table (CodTraitement, [value]);
INSERT INTO @Values (CodTraitement, [value])
VALUES('CGPFDG','0220'),
('CGPPS','5275'),
('CGPFP','5276'),
('CGPGC','5277'),
('CGPGC','0220');
INSERT INTO @MyList (ColumName)
SELECT ISNULL(V.[value],'0241')
FROM (VALUES(@pCodTraitement))p(CodTraitement)
LEFT JOIN @Values V ON p.CodTraitement = V.CodTraitement;
另一种方法是将 UNION ALL
与匹配 CGPGC
:
的多行一起使用
INSERT INTO @MyList SELECT '0220' WHERE @pCodTraitement = 'CGPFDG'
UNION ALL SELECT '5275' WHERE @pCodTraitement = 'CGPPS'
UNION ALL SELECT '5276' WHERE @pCodTraitement = 'CGPFP'
UNION ALL SELECT '5277' WHERE @pCodTraitement = 'CGPGC'
UNION ALL SELECT '0220' WHERE @pCodTraitement = 'CGPGC';
或者构建一个VALUES
派生table和过滤器:
INSERT INTO @MyList
SELECT outcol FROM
(
VALUES('CGPFDG','0220'),
('CGPPS', '5275'),
('CGPFP', '5276'),
('CGPGC', '5277'),
('CGPGC', '0220')
) AS dv(pCodTraitement, outcol)
WHERE pCodTraitement = @pCodTraitement;
我正在尝试使用插入中的案例创建一些逻辑
这是我正在使用的代码,但无法编译
INSERT INTO @MyList VALUES
(CASE @pCodTraitement
WHEN 'CGPFDG' then '0220'
WHEN 'CGPPS' then '5275'
WHEN 'CGPFP' then '5276'
WHEN 'CGPGC' then '5277', '0220'
ELSE '0241'
END )
解决方案 '''5277'''+','+'''0220''' 无效
我需要满足第 4 个条件,就像项目而不是文本一样,因为我想在
之后使用它我不想将其作为文本块
因为我会浏览它的项目
...
SELECT *
FROM MyTable
WHERE MyColumn IN (SELECT Value FROM @MyList)
...
由于您需要在其中一个条件下插入多个值,并且 CASE
到 return 多个值不可能以这种方式插入,因此您需要中断操作分开并做类似
IF @pCodTraitement = 'CGPGC'
BEGIN
INSERT INTO @MyList
VALUES ('5277'), ('0220');
END ELSE
BEGIN
INSERT INTO @MyList VALUES
(CASE @pCodTraitement
WHEN 'CGPFDG' then '0220'
WHEN 'CGPPS' then '5275'
WHEN 'CGPFP' then '5276'
ELSE '0241'
END )
END
这里是猜测,但可能是以下解决方案之一:
INSERT INTO @MyList (ColumName)
SELECT SS.[value]
FROM (VALUES(CASE @pCodTraitement WHEN 'CGPFDG' THEN '0220'
WHEN 'CGPPS' THEN '5275'
WHEN 'CGPFP' THEN '5276'
WHEN 'CGPGC' THEN '5277,0220'
ELSE '0241'
END))V(S)
CROSS APPLY STRING_SPLIT(V.S,',') SS;
DECLARE @Values table (CodTraitement, [value]);
INSERT INTO @Values (CodTraitement, [value])
VALUES('CGPFDG','0220'),
('CGPPS','5275'),
('CGPFP','5276'),
('CGPGC','5277'),
('CGPGC','0220');
INSERT INTO @MyList (ColumName)
SELECT ISNULL(V.[value],'0241')
FROM (VALUES(@pCodTraitement))p(CodTraitement)
LEFT JOIN @Values V ON p.CodTraitement = V.CodTraitement;
另一种方法是将 UNION ALL
与匹配 CGPGC
:
INSERT INTO @MyList SELECT '0220' WHERE @pCodTraitement = 'CGPFDG'
UNION ALL SELECT '5275' WHERE @pCodTraitement = 'CGPPS'
UNION ALL SELECT '5276' WHERE @pCodTraitement = 'CGPFP'
UNION ALL SELECT '5277' WHERE @pCodTraitement = 'CGPGC'
UNION ALL SELECT '0220' WHERE @pCodTraitement = 'CGPGC';
或者构建一个VALUES
派生table和过滤器:
INSERT INTO @MyList
SELECT outcol FROM
(
VALUES('CGPFDG','0220'),
('CGPPS', '5275'),
('CGPFP', '5276'),
('CGPGC', '5277'),
('CGPGC', '0220')
) AS dv(pCodTraitement, outcol)
WHERE pCodTraitement = @pCodTraitement;