2

再会,

所以我坚持使用 SQL 查询,其中我正在查询的表有多个连续列,例如

Property1,
Property2,
Property3,
Property4,
Property5
..etc

现在有大约 64 列在相同的命名约定中下降。它们是 varchar 类型,并由单个“Y”或“N”表示布尔函数标记。(不是我的设计)

现在我陷入困境的是,在我的查询中,我需要返回在单个记录中标记为“Y”的第一个属性列。

我四处搜寻,但无法在其他地方遇到同样的问题。也许我只是想念它?

如果有人暗示我要遵循或等等,我将不胜感激?提前致谢!

4

5 回答 5

3

基本思想是连接一个字符串中的所有字段,然后找到第一次出现的索引Y并形成一个字段标签作为PROPERTY+ FIRST OCCURRENCE INDEX。如果Y未找到,则PROPERTY0出现在此查询中,例如,您可以使用 CASE 语句处理此问题。

SQLFiddle 演示

select id,
       'PROPERTY'+
       CONVERT(VARCHAR(10),CHARINDEX('Y',property1+property2+property3)) 

from T
于 2013-11-07T08:42:25.123 回答
2

那个设计太可怕了。但这应该有效:

SELECT CASE WHEN Property1 = 'Y' THEN 'Property1'
            WHEN Property2 = 'Y' THEN 'Property2'
            [...]
       ELSE 'None'
       END
于 2013-11-07T08:42:18.223 回答
2

你可以考虑 unpivot

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
于 2013-11-07T08:52:03.890 回答
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
于 2013-11-07T08:56:36.577 回答
0

这也可以工作:

SELECT CHARINDEX ( 'Y' , CONCAT(Property1,Property2,...,Property64) )

它返回列的数字索引,它的优点是您可以定义基于函数的索引以加快查询速度。

于 2013-11-07T09:03:57.130 回答