返回与参数匹配的单个列

时间:2018-02-21 20:18:40

标签: sql-server

在存储过程方案中,我想返回一个匹配特定条件的列,同时为该列分配适当的名称。

  • 以下技术的问题在于它返回所有列,包括那些与条件不匹配的列,并为它们分配空值。

    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列。

3 个答案:

答案 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