动态 TSQL CASE 且不显示 table 不在逗号分隔列表中

Dynamic TSQL CASE and not display table not in comma separated list

嘿,我正在做一些 动态 查询,并且在我的 select 语句中有一个 CASE ,如下所示:

DECLARE @valueList varchar(8000)
DECLARE @pos int
DECLARE @len int
DECLARE @value varchar(8000)
SET @valueList = 'Description,hardwarePartNumber,poc,'

BEGIN
    SET @len = CHARINDEX(',', @valueList, @pos+1) - @pos
    SET @value = SUBSTRING(@valueList, @pos, @len)
SELECT 
    CAST(CASE WHEN @value = 'Description' THEN 
         BL.Description END AS varchar)                 AS 'Description',
    CAST(CASE WHEN @value = 'hardwarePartNumber' THEN 
         BL.hardwarePartNumber END AS varchar)          AS 'hardwarePartNumber',
    CAST(CASE WHEN @value = 'poc' THEN 
         UT.lastFirstMiddle END AS int)                 AS 'poc',
    CAST(CASE WHEN @value = 'quantity' THEN 
         BL.quantity END AS int)                        AS 'quantity',
      etc...etc....
FROM 
    bLine                  AS BL 
INNER JOIN usersTbl        AS UT 
    ON BL.poc              = UT.id
      etc...etc....

这很好用,但是将 table 名称放在结果中,即使它没有 table 名称以 逗号分隔 列表。

因此对于上面的示例,输出将如下所示:

Description    |hardwarePartNumber |poc        |quantity
--------------------------------------------------------
something here |568FHT             |Bob Barker |NULL
another thing  |GT43643            |Steve Jobs |NULL
Hey hey hey    |DSTN345            |Fat Albert |NULL

注意 数量NULL 因为在 逗号分隔的 列表中找不到它.我希望它看起来像下面这样:

Description    |hardwarePartNumber |poc
-----------------------------------------------
something here |568FHT             |Bob Barker
another thing  |GT43643            |Steve Jobs
Hey hey hey    |DSTN345            |Fat Albert

因此,如果它不在 逗号分隔的 列表中,则不要在最终查询中显示 table。

继续 etc. 风格 - 使用 CROSS APPLY 和 STRING_SPLIT:

Select distinct
    ..
    compare BL columns against BL2.value
    ..

FROM 
    bomLine                AS BL 
    cross apply STRING_SPLIT ('Description,hardwarePartNumber,poc,', ',') BL2

答案如下:

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp

SELECT CAST(BL.Description AS varchar) AS 'Description',
    CAST(  BL.hardwarePartNumber AS varchar)            AS 'hardwarePartNumber',
    CAST(UT.lastFirstMiddle END AS int)                 AS 'poc',
    CAST(BL.quantity END AS int)                        AS 'quantity',
      etc...etc....

INTO #Temp
FROM 
    bLine                  AS BL 
INNER JOIN usersTbl        AS UT 
    ON BL.poc              = UT.id
      etc...etc....

DECLARE @valueList varchar(8000)
SET @valueList = 'Description,hardwarePartNumber,poc,'

DECLARE @SQL varchar(max) = 'SELECT ' + LEFT(@valuelist,LEN(@valuelist)-1 + ' FROM #Temp'    
EXEC(@SQL)