ITPUB论坛-中国专业的IT技术社区

 找回密码
 注册
查看: 4070|回复: 6

[SQL] 请教一个类似判断语句的写法

[复制链接]
认证徽章
论坛徽章:
8
秀才
日期:2017-09-18 17:01:40秀才
日期:2018-01-02 15:05:22秀才
日期:2018-01-02 15:13:25秀才
日期:2018-01-02 15:13:38秀才
日期:2018-01-02 15:13:38技术图书徽章
日期:2018-01-02 15:13:47秀才
日期:2018-01-02 15:35:05秀才
日期:2018-01-02 15:35:30
发表于 2017-12-21 11:36 | 显示全部楼层 |阅读模式
数据库:11.2.0.3
我现在有个想法,语句需求如下:
select * from (select case
                         when (select count(*)
                                       from pc  inner join a
                                           on pc.cnt_content=a.id
                                     where pc.floor_node_id='201712200674'   
                                         and pc.group_id='4')=0            
                           then ad.name
                           else
                           (select a.name
                                       from pc  inner join a
                                           on pc.cnt_content=a.id
                                     where            pc.floor_node_id='201712200674'   
                                         and pc.group_id='4')
                           end as addressname

                           from ad left join m
                                on ad.id=m.province
                                       left join mc
                                 on ad.id=mc.city  
                                       left join t
                                 on m.prod.id=t.matrt_id
                              where m.province is not null and t.status in ('2','4') group by ad.name        
                     ) ac  order by  ac.addressname


帮忙指点一下!多谢!nvl判断null可否在这里使用?
来自安卓客户端来自客户端
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2017-12-21 13:55 | 显示全部楼层
没太明白楼主的意思,但这个语句逻辑上是有问题的。

使用道具 举报

回复
认证徽章
论坛徽章:
8
秀才
日期:2017-09-18 17:01:40秀才
日期:2018-01-02 15:05:22秀才
日期:2018-01-02 15:13:25秀才
日期:2018-01-02 15:13:38秀才
日期:2018-01-02 15:13:38技术图书徽章
日期:2018-01-02 15:13:47秀才
日期:2018-01-02 15:35:05秀才
日期:2018-01-02 15:35:30
发表于 2017-12-21 14:43 | 显示全部楼层
sqysl 发表于 2017-12-21 13:55
没太明白楼主的意思,但这个语句逻辑上是有问题的。

就是判断下面这个语句,
(select count(*)
                                       from pc  inner join a
                                           on pc.cnt_content=a.id
                                     where pc.floor_node_id='201712200674'   
                                         and pc.group_id='4')
如果为0,即count(*)为0,则case的结果为ad.name(该结果为后面三表关联查询的结果),如果count(*)不为0,则返回该条件的结果:
(select a.name
                                       from pc  inner join a
                                           on pc.cnt_content=a.id
                                     where pc.floor_node_id='201712200674'   
                                         and pc.group_id='4')
来自安卓客户端来自客户端

使用道具 举报

回复
认证徽章
论坛徽章:
8
2009新春纪念徽章
日期:2009-01-04 14:52:28祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:07:24ITPUB9周年纪念徽章
日期:2010-10-08 09:32:25ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:57:31
发表于 2017-12-21 14:48 | 显示全部楼层
gangade 发表于 2017-12-21 14:43
就是判断下面这个语句,
(select count(*)
                                       from pc  inner join ...

如果count(*)不为零,也可能存在多条记录,那样会报错的。

使用道具 举报

回复
论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:53
发表于 2017-12-21 22:30 | 显示全部楼层
可以在NVL中使用标量子查询。
NVL((select a.name
                                       from pc  inner join a
                                           on pc.cnt_content=a.id
                                     where            pc.floor_node_id='201712200674'   
                                         and pc.group_id='4'), ad.name)

但要注意返回多于一行的情况,你原写法就有这个问题。除非你的查询条件是用在唯一索引上。如果确定所有返回数据都相同也可以加上AND ROWNUM=1

使用道具 举报

回复
认证徽章
论坛徽章:
8
秀才
日期:2017-09-18 17:01:40秀才
日期:2018-01-02 15:05:22秀才
日期:2018-01-02 15:13:25秀才
日期:2018-01-02 15:13:38秀才
日期:2018-01-02 15:13:38技术图书徽章
日期:2018-01-02 15:13:47秀才
日期:2018-01-02 15:35:05秀才
日期:2018-01-02 15:35:30
发表于 2017-12-22 07:40 | 显示全部楼层
sqysl 发表于 2017-12-21 14:48
如果count(*)不为零,也可能存在多条记录,那样会报错的。

谢谢指点,已发现这个问题
来自安卓客户端来自客户端

使用道具 举报

回复
认证徽章
论坛徽章:
8
秀才
日期:2017-09-18 17:01:40秀才
日期:2018-01-02 15:05:22秀才
日期:2018-01-02 15:13:25秀才
日期:2018-01-02 15:13:38秀才
日期:2018-01-02 15:13:38技术图书徽章
日期:2018-01-02 15:13:47秀才
日期:2018-01-02 15:35:05秀才
日期:2018-01-02 15:35:30
发表于 2017-12-22 07:41 | 显示全部楼层
newkid 发表于 2017-12-21 22:30
可以在NVL中使用标量子查询。
NVL((select a.name
                                       from pc  inn ...

多谢版主指点
来自安卓客户端来自客户端

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表