就是想判断第一个字段为空的时候就判断第二个字段,一直判断下去知道某个字段不为空是返回数据
select (case when column1 is null then (case when .....then.....else...)else column1)as column from emp 穷举一下?
为什么不在返回数据后再判断是否为空呢,这样不是更简单一些?
需要知道你要判断多少个字段。
这是我的表结构
DROP TABLE IF EXISTS tt
;
CREATE TABLE tt
(id
int(11) NOT NULL,t1
varchar(255) DEFAULT NULL,t2
varchar(255) DEFAULT NULL,t3
varchar(255) DEFAULT NULL,t4
varchar(255) DEFAULT NULL,t5
varchar(255) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这是我查询的sql
select id, if(ISNULL(t1),if(ISNULL(t2),if(ISNULL(t3),if(ISNULL(t4),if(ISNULL(t5),0,t5),t4),t3),t2),t1) aa from tt
这是我查询的结果
id aa
0 111111
1 2
2 3
3 4
4 5
从前到后判断 如果遇到不为空的ifNull就会停止向后查询
可能还有别的方法 暂时想不到
可以用while循环,
每次都一条记录出来
select * from tt
先判断下是否到表的结尾了,是就退出while循环,
不是就判断读出的这条记录,每个字段是否存在空的情况
有空就退出while循环,没有就移到下一条数据,回到循环的第一条语句。
还是在代码里判断吧,sql不好弄
如果是用在具体的IDE里,例如VB等。用ADO控制数据库,非常容易实现要求。如果只是在sql里,我试验了下,也是可以用循环实现
例如:我数据库的数据如下:
declare @p1 int
declare qindex cursor for select id from tt
open qindex
fetch next from qindex into @p1
while @@FETCH_STATUS = 0
begin
if exists(select * from tt where id=@p1 and (t1 is not null or t2 is not null or t3 is not null))
select * from tt where id=@p1
else
break;
fetch next from qindex into @p1
end
close qindex
deallocate qindex
用上面在sql里运行,可以实现不为空返回数据。字段全为空退出。
这种业务操作还是在代码里面操作吧,,数据库这么宝贵的资源还是用来增删改查就好了,
你是不是只是想要返回结果组装数据?可以试试
SELECT CONCAT(f1, f2, f3, '默认值') AS result FROM t
取出来后在程序段判断仅等于默认值的时候说明所有列都为空了
IF(trim(result) == '默认值') echo '列全部为空';
SELECT (CASE WHEN COLUMN1 IS NULL THEN
(CASE WHEN COLUMN2 IS NULL THEN
(CASE WHEN COLUMN3 IS NULL THEN
(CASE WHEN COLUMN4 IS NULL THEN
(CASE WHEN COLUMN5 IS NULL THEN '意见为空'
ELSE COLUMN5 END)
ELSE COLUMN4 END)
ELSE COLUMN3 END)
ELSE COLUMN2 END)
ELSE COLUMN1 END) AS YOUR_COLUMN FROM YOUR_TABLE
用coalesce(), 例: select coalesce(c1,c2,c3,..,cn,0) as c from table 当c1 is null 则判断c2 依次类推,直到取到第一个不为null的字段。