#sql #sql-server #database
#sql #sql-сервер #База данных
Вопрос:
У меня есть скрипт, который возвращает результаты на основе одного или нескольких условий. Существует около 20 столбцов, в которых может быть результат. Есть ли способ добавить сводный столбец в конце, чтобы указать, какие столбцы имеют значение для каждой записи?
Редактировать: SQL Server 2008 R2
Комментарии:
1. можете ли вы добавить, какую версию SQL Server вы используете?. Также, пожалуйста, опубликуйте пример результата, который вы хотите
2. Ваш вопрос немного двусмысленный. Примеры данных и желаемые результаты более полезны.
Ответ №1:
Это всего лишь предположение, но вот один из подходов, который будет использовать немного XML для решения этой проблемы
Пример
Declare @YourTable Table (ID int,Col1 varchar(50),Col2 varchar(50),Col3 varchar(50))
Insert Into @YourTable Values
(1,'HasValue',null,null)
,(2,'HasValue',null,'ValueHere')
Select A.*
,C.*
From @YourTable A
Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
Cross Apply (
Select Columns = Stuff((Select ',' Item
From (
Select Item = xAttr.value('local-name(.)', 'varchar(100)')
,Value = xAttr.value('.','varchar(max)')
From XMLData.nodes('//@*') xNode(xAttr)
Where xAttr.value('local-name(.)','varchar(100)') not in ('ID','OtherColumns','ToExclude')
)C1
For XML Path ('')),1,1,'')
) C
ВОЗВРАТ
ID Col1 Col2 Col3 Columns
1 HasValue NULL NULL Col1
2 HasValue NULL ValueHere Col1,Col3
Ответ №2:
Решение не такое удобное, как у Джона, но здесь представлена версия «грубой силы», которая будет работать на более старой версии SQL Server.
DECLARE @t TABLE (
Col1 BIT,
Col2 BIT,
Col3 BIT
)
INSERT INTO @t SELECT 1,NULL,NULL
INSERT INTO @t SELECT NULL,1,NULL
INSERT INTO @t SELECT NULL,NULL,1
SELECT
*
, CASE WHEN Col1 IS NOT NULL THEN 'Col1: ' CONVERT(VARCHAR(20),Col1) ELSE '' END
CASE WHEN Col2 IS NOT NULL THEN 'Col2: ' CONVERT(VARCHAR(20),Col2) ELSE '' END
CASE WHEN Col3 IS NOT NULL THEN 'Col3: ' CONVERT(VARCHAR(20),Col3) ELSE '' END
AS [Summary]
FROM @t