SQL - 根据行中值的出现查找列名称

时间:2017-05-29 06:55:23

标签: sql sql-server

enter image description here

这是我的表测试。 这里9到22是列名。 我想获取第一次和最后一次出现数据1的列名。 我该怎么做?

例如,在第一行中,我有第9列和第10列的数据1,因此对于此行,我希望获取9和10。 类似地,在最后一行中,第一次出现的数据1在9中,最后一次出现在17列中,因此我应该得到9和17作为输出。 试过this问题,但没有运气!

2 个答案:

答案 0 :(得分:1)

如果你有固定数量的列,你可以

MariaDB [sandbox]> drop table if exists t;
Query OK, 0 rows affected (0.03 sec)

MariaDB [sandbox]> create table t (id int, col1 int,col2 int,col3 int,col4 int);
Query OK, 0 rows affected (0.12 sec)

MariaDB [sandbox]> insert into t values
    -> (1,1,1,0,0),
    -> (2,0,0,1,1);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]> select t.id, concat(col1,col2,col3,col4), instr(concat(col1,col2,col3,col4),1) firstcol,
    ->  5 - instr(reverse(concat(col1,col2,col3,col4)),1) lastcol
    -> from t;
+------+-----------------------------+----------+---------+
| id   | concat(col1,col2,col3,col4) | firstcol | lastcol |
+------+-----------------------------+----------+---------+
|    1 | 1100                        |        1 |       2 |
|    2 | 0011                        |        3 |       4 |
+------+-----------------------------+----------+---------+
2 rows in set (0.00 sec)

答案 1 :(得分:1)

Declare @InputTable Table
(
 A9 varchar(1),
 A10 varchar(1),
 A11 varchar(1),
 A12 varchar(1),
 A13 varchar(1),
 A14 varchar(1),
 A15 varchar(1),
 A16 varchar(1),
 A17 varchar(1),
 A18 varchar(1),
 A19 varchar(1),
 A20 varchar(1),
 A21 varchar(1),
 A22 varchar(1)            
)

Insert into @InputTable values
(1,1,0,0,0,0,0,0,0,0,0,0,0,0),
(0,0,1,1,0,0,0,0,0,0,0,0,0,0),
(0,0,0,0,1,1,0,0,0,0,0,0,0,0),
(0,0,0,0,0,0,1,1,0,0,0,0,0,0),
(0,0,0,0,0,0,0,0,1,1,0,0,0,0),
(0,0,0,0,0,0,0,0,0,0,0,0,1,1),
(1,1,1,1,1,1,1,1,1,1,1,0,0,0),
(0,0,0,0,0,0,0,0,0,1,1,1,0,0),
(0,0,0,0,0,0,0,0,0,0,0,0,1,1),
(1,1,1,1,1,1,1,1,1,0,0,0,0,0)


Select concat('A',8+CHARINDEX('1',Derivedcolumn)) [First], concat('A',23-charindex('1',reverse(derivedcolumn)))[Last]  from
(
Select A9+A10+A11+A12+A13+A14+A15+A16+A17+A18+A19+A20+A21+A22 DerivedColumn,* from @InputTable
)InputTable

组合每一列,使用CHARINDEX查找第一次出现,并在最后一次出现时,反转字符串并在反向字符串中找到第一次出现,这将是我们案例中的最后一次。