2012-07-17 147 views
0

增加我需要在SQL dinamically创建一个新列根据某些条件新选择列根据条件在SQL

ID ||| COLUMN1 ||| COLUMN2 ||| COLUMN3 ||| COLUMN 4 |||NEW_COLUMN 
1  null  null  null   12  
2   13   null  null   18   1 
3  null  null  null   82    
4  null  null  null   81   
5  null  null  31   89   2 
6  null  22   32   91   3 
7  null  92   null   95   4 
计数器

计数器会增加只有当COLUMN1或COLUMN2或列3 = NULL

的一句话会是这样的:

SELECT COLUMN1,COLUMN2,COLUMN3,COLUMN4, (SELECT .....) FROM ... WHERE ... 

我不知道这是否可能,或者如果这是在效率方面面对此问题的正确方法。其他的可能性是用java或Jasper Reports做的,但我认为SQL是最简单的方法。

任何建议是值得欢迎的。

谢谢

+0

什么数据库引擎? – 2012-07-17 11:29:10

+0

数据库引擎:MySQL 5.5.24 – R5498 2012-07-17 11:31:54

回答

1
select t.*, (@row := case 
        when column1 is not null or column2 is not null or column3 is not null 
        then @row 
        else null 
      end) as NEW_COLUMN, 
      (@row := case 
        when column1 is not null or column2 is not null or column3 is not null 
        then @row + 1 
        else @row 
      end) as TEMP_COLUMN 
from your_table t, (select @row := 0) r 

我用temp_column作为帮手。

+0

'CASE'语句中的条件应该使用'OR'而不是'AND',因为他们希望计数器在前三列中的任何一列不为空时递增,而不是在所有他们不是空的。 – 2012-07-17 11:36:37

+0

你说得对。更正它。 – 2012-07-17 11:39:09

+0

工程就像一个魅力,谢谢你:) – R5498 2012-07-17 11:57:26

0

另一种方式

select a.ID,a.COLUMN1,a.COLUMN2,a.COLUMN3,a.COLUMN4,COUNT(b.ID) from 
(select * from <your_table> where coalesce(column1,column2,column3) is not null)a 
join 
(select * from <your_table> where coalesce(column1,column2,column3) is not null)b 
on a.ID>=b.ID 
group by a.ID,a.COLUMN1,a.COLUMN2,a.COLUMN3,a.COLUMN4 
union all 
select *,null from <your_table> where coalesce(column1,column2,column3) is null 
order by id