美好的一天,
所以我坚持使用SQL查询,其中我查询的表有多个连续列,例如
Property1,
Property2,
Property3,
Property4,
Property5
..etc
现在在同一命名约定中有大约64列降序。 它们是varchar类型,并用一个“Y”或“N”表示布尔函数。(不是我的设计)
现在我遇到的问题是,在我的查询中,我需要在单个记录中返回标记为“Y”的First Property列。
我已经四处寻找但是不可能在别处问过同样的问题。也许我只是错过了它?
如果有人提示我跟随等等,真的很感激吗? 提前谢谢!
答案 0 :(得分:3)
基本思想是连接一个字符串中的所有字段,然后找到第一次出现Y
的索引,并将字段标签形成为PROPERTY
+ FIRST OCCURRENCE INDEX
。
如果未找到Y
,则此查询中会显示PROPERTY0
,您可以使用CASE语句处理此问题。
select id,
'PROPERTY'+
CONVERT(VARCHAR(10),CHARINDEX('Y',property1+property2+property3))
from T
答案 1 :(得分:2)
那个设计太可怕了。但这应该有效:
SELECT CASE WHEN Property1 = 'Y' THEN 'Property1'
WHEN Property2 = 'Y' THEN 'Property2'
[...]
ELSE 'None'
END
答案 2 :(得分:2)
您可以考虑使用
declare @t table(id int identity(1,1), Property1 char(1),
Property2 char(1),
Property3 char(1),
Property4 char(1),
Property5 char(1))
insert @t values('N', 'Y', 'Y', 'N', 'Y')
insert @t values('N', 'N', 'Y', 'N', 'Y')
insert @t values('N', 'N', 'N', 'N', 'Y')
;with a as
(
select *, row_number() over (partition by id order by id) position from @t
unpivot
(Property FOR colname IN
([Property1], [Property2], [Property3], [Property4],
[Property5]/*include more properties here*/) ) AS unpvt
)
select t.id, coalesce(colname, 'Not found') colname
from @t t
outer apply
(select top 1 id, colname, position
from a where Property = 'Y'
and t.id = id
order by id
) x
答案 3 :(得分:1)
试试这个:
select
CASE WHEN QryGroup1 = 'Y' then 'QryGroup1'
WHEN QryGroup2 = 'Y' then 'QryGroup2'
WHEN QryGroup3 = 'Y' then 'QryGroup3'
WHEN QryGroup10 = 'Y' then 'QryGroup10'
else ''
end as [SelectedBP]
from OCRD
答案 4 :(得分:0)
这也可以起作用:
SELECT CHARINDEX ( 'Y' , CONCAT(Property1,Property2,...,Property64) )
它返回列的数字索引,它的优点是您可以定义基于函数的索引来加速查询。