请教各位大神关于sql的问题 5C

就是想判断第一个字段为空的时候就判断第二个字段,一直判断下去知道某个字段不为空是返回数据

11个回答

为什么不在返回数据后再判断是否为空呢,这样不是更简单一些?

qq_38173469
qq_38173469 回复qq_38173469: OA流程申请这块,他们把意见都写到了一个表里,而且是几个字段共同控制的
一年多之前 回复
qq_38173469
qq_38173469 软件那块是一个查询数据的窗口
一年多之前 回复

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的字段。

select (case when column1 is null then (case when .....then.....else...)else column1)as column from emp 穷举一下?

qq_38769195
qq_38769195 回复sinat_36743893: 替换了
一年多之前 回复
sinat_36743893
叫我啊墨吧 回复qq_38173469: .....你当然是你的数据库列名是什么就替换成什么啊 难不成你的字段名称也是column1.2.3.4?
一年多之前 回复
qq_38173469
qq_38173469 回复sinat_36743893: 我用这个怎么提示列名无效呢
一年多之前 回复
sinat_36743893
叫我啊墨吧 回复qq_38173469: sql是有一定效率问题的,但是虚拟机跑代码会比与数据库交互快得多
一年多之前 回复
sinat_36743893
叫我啊墨吧 回复qq_38173469: 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)) else column4)) else column3)) else column2)else column1)as column from emp
一年多之前 回复
qq_38173469
qq_38173469 如果是判断五个字段,case when....then.....else这块怎么写
一年多之前 回复

图片说明 需要知道你要判断多少个字段。

这是我的表结构

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就会停止向后查询

可能还有别的方法 暂时想不到

qq_36291682
shadowPK小明 回复qq_38769195: 那你肯定没写对 把表结构和需要判断的字段名称发出来 然后我我给你写
一年多之前 回复
qq_38769195
qq_38769195 回复qq_36291682: 改了之后就提示那个东西
一年多之前 回复
qq_36291682
shadowPK小明 回复qq_38173469: ? 什么意思 sql不是给你了 你直接复制过去 把表名改了 字段名改了 就行了
一年多之前 回复
qq_38173469
qq_38173469 我写的有问题,提示Isnull必须为两个参数
一年多之前 回复

可以用while循环,
每次都一条记录出来
select * from tt
先判断下是否到表的结尾了,是就退出while循环,
不是就判断读出的这条记录,每个字段是否存在空的情况
有空就退出while循环,没有就移到下一条数据,回到循环的第一条语句。

pennytang
pennytang 回复qq_38173469: 你用哪种编程语言呢?
一年多之前 回复
qq_38173469
qq_38173469 请问具体怎么实现?
一年多之前 回复

还是在代码里判断吧,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里运行,可以实现不为空返回数据。字段全为空退出。

这种业务操作还是在代码里面操作吧,,数据库这么宝贵的资源还是用来增删改查就好了,

共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!