在存储过程方案中,我想返回一个匹配特定条件的列,同时为该列分配适当的名称。
以下技术的问题在于它返回所有列,包括那些与条件不匹配的列,并为它们分配空值。
SELECT DISTINCT
CASE WHEN @ColumnName = 'A' THEN s.suborderid END AS ColA
, CASE WHEN @ColumnName = 'B' THEN s.orderid END AS ColB
, CASE WHEN @ColumnName = 'C' THEN s.envelopeid END AS ColC
在这种情况下,如何仅返回与@ColumnName参数匹配的第一列?
使用 Demo更新了
目标是仅返回ReadyDesc列。
答案 0 :(得分:1)
您可以在存储过程中使用IF .. ELSE IF块
IF @ColumnName = 'Ready'
BEGIN
SELECT DISTINCT Ready As ReadyDesc
FROM #ImagesTable
END
ELSE IF @ColumnName = 'Quality'
BEGIN
SELECT DISTINCT Quality As QualtiyDesc
FROM #ImagesTable
END
编辑 Demo
答案 1 :(得分:1)
使用Dynamic Query
应该返回您要求的列。
create table #ImagesTable(
Quality nvarchar(50),
Ready nvarchar(50))
-- insert into the temporary table
INSERT INTO #ImagesTable(Quality,Ready)
Values
(1, 1),
(1, 1),
(1, 1),
(1, 1),
(1, 1),
(1, 0),
(1, 0),
(1, 0),
(1, 0),
(1, 0);
DECLARE @ColumnName nvarchar(50) = 'Ready';
declare @mysql nvarchar(max)
select @mysql = N'Select distinct ' + @ColumnName + ' from #ImagesTable';
execute sp_executesql @mysql
drop table #ImagesTable
答案 2 :(得分:1)
当然动态SQL 或扩展CASE会更高效,但以下是动态而不实际动态。
示例强>
DECLARE @ColumnName nvarchar(50) = 'Ready';
Select Distinct C.*
From #ImagesTable A
Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
Cross Apply (
Select Field = a.value('local-name(.)','varchar(100)')
,Value = a.value('.','varchar(max)')
From B.XMLData.nodes('/row') as C1(n)
Cross Apply C1.n.nodes('./@*') as C2(a)
Where a.value('local-name(.)','varchar(100)') in (@ColumnName )
) C
<强>返回强>
Field Value
Ready 0
Ready 1