SQL选择第一列以匹配单行中多列的条件

时间:2013-11-07 08:31:13

标签: sql sql-server sql-server-2008 multiple-columns

美好的一天,

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

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

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

现在我遇到的问题是,在我的查询中,我需要在单个记录中返回标记为“Y”的First Property列。

我已经四处寻找但是不可能在别处问过同样的问题。也许我只是错过了它?

如果有人提示我跟随等等,真的很感激吗? 提前谢谢!

5 个答案:

答案 0 :(得分:3)

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

SQLFiddle demo

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) )

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