动态 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)
嘿,我正在做一些 动态 查询,并且在我的 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)