返回与我的Where匹配的列

use*_*516 1 sql t-sql sql-server

可以说我有这个测试表:

CREATE TABLE Test (AdrNr INT, Nr1 INT, Nr2 INT, Nr3 INT, Nr4 INT, Nr5 INT, Nr6 INT, Nr7 INT)

INSERT INTO @t
VALUES (500, 3, 4, 8, 42, 5, 76, 91)
Run Code Online (Sandbox Code Playgroud)

现在我想知道任何Nr1..Nr7列中是否有8 个:

SELECT *
FROM Test
WHERE 8 IN (Nr1, Nr2, Nr3, Nr4, Nr5, Nr6, Nr7);
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我的问题是,是否有可能得到的AdrNr,然后只从列Nr1Nr7具有8.

结果应该是:

AdrNr  Nr3
500    8
Run Code Online (Sandbox Code Playgroud)

Dev*_*art 6

DECLARE @t TABLE (AdrNr INT, Nr1 INT, Nr2 INT, Nr3 INT, Nr4 INT, Nr5 INT, Nr6 INT, Nr7 INT)

INSERT INTO @t
VALUES (500, 3, 4, 8, 42, 5, 76, 91)

SELECT AdrNr, a
FROM @t
CROSS APPLY (
    VALUES
        ('Nr1', Nr1),
        ('Nr2', Nr2),
        ('Nr3', Nr3),
        ('Nr4', Nr4),
        ('Nr5', Nr5),
        ('Nr6', Nr6),
        ('Nr7', Nr7)
) t(a, b)
WHERE b = 8
Run Code Online (Sandbox Code Playgroud)

输出 -

AdrNr       a   
----------- ----
500         Nr3 
Run Code Online (Sandbox Code Playgroud)

关于VALUES的帖子:UNPIVOT是将列转换成行的最佳方式吗?

更新(动态SQL):

DECLARE @t TABLE (AdrNr INT, Nr1 INT, Nr2 INT, Nr3 INT, Nr4 INT, Nr5 INT, Nr6 INT, Nr7 INT)

INSERT INTO @t
VALUES
    (500, 3, 4, 8, 42, 5, 76, 91),
    (501, 3, 8, 8, 42, 5, 76, 91)

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

SELECT AdrNr, t.col, t.val
INTO #tbl
FROM @t
CROSS APPLY (
    VALUES
        ('Nr1', Nr1), ('Nr2', Nr2), ('Nr3', Nr3), ('Nr4', Nr4),
        ('Nr5', Nr5), ('Nr6', Nr6), ('Nr7', Nr7)
) t(col, val)
WHERE val = 8

DECLARE @SQL NVARCHAR(MAX)
SET @SQL = '
SELECT *
FROM #tbl
PIVOT (
    MAX(val)
    FOR col IN (' + STUFF((
    SELECT DISTINCT ', [' +  col + ']'
    FROM #tbl
    FOR XML PATH('')), 1, 2, '') + ') 
) p'

EXEC sys.sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)

输出 -

AdrNr       Nr2         Nr3
----------- ----------- ---------
500         NULL        8
501         8           8
Run Code Online (Sandbox Code Playgroud)