赞
踩
if (字段 = 1, {条件为true执行的结果}, {添加为false执行的结果})
- -- 1. success!! mysql if 表达式的使用,在where条件中使用if表达式
- SELECT
- count(*)
- FROM
- noti_notification n
- WHERE
- 1 = 1
- AND (n.creator_id = '856187440439296' OR (n.id IN ( 11, 22)))
- AND
- IF(response_type = 1,
- actual_total_user != (SELECT count(*) FROM noti_visit_log WHERE notification_id = n.id),
- actual_total_user != (SELECT count(*) FROM noti_reply WHERE notification_id = n.id)
- )
- AND n.tenant_id = 810192326787072
- AND n.type = 1;
-

if (字段 = 1, {条件为true执行的结果}, {添加为false执行的结果})
-
- -- 2. success!! mysql if 表达式的使用,在where条件中使用if表达式,以及在 查询结果中使用if表达式
- select if(pi.type_key ='1', 'a', 'b') as type_key, pi.* from BUS_DATA_CENTER.tc_project_info pi;
-
-
- select if(pi.type_key ='1', 'a', 'b') as type_key, pi.* from BUS_DATA_CENTER.tc_project_info pi where 1=1
- and if (pi.TYPE_KEY = '1', pi.JURISDICTION_KEY = '1', pi.JURISDICTION_KEY = '0');
-
-
上面的两种 if表达式的使用在mysql数据库,以及国产达梦数据库都是能正常执行的,没有报错。
这也不是我们今天说的关键点。继续往下看。
-
- -- 2.1. success!! mysql case when 表达式的使用
- SELECT
- count(*)
- FROM
- noti_notification n
- WHERE
- 1 = 1
- AND (n.creator_id = '856187440439296' OR (n.id IN ( 11, 22)))
- AND
- CASE WHEN response_type = 1
- THEN actual_total_user != (SELECT count(*) FROM noti_visit_log WHERE notification_id = n.id)
- ELSE actual_total_user != (SELECT count(*) FROM noti_reply WHERE notification_id = n.id )
- END
- AND n.tenant_id = 810192326787072
- AND n.type = 1;

2.2 和上面的 2.1 还是有些区别的。请注意观察 actual_total_user != 是写在外面。
- -- 2.2. success!! mysql case when 表达式的使用
- SELECT
- count(*)
- FROM
- noti_notification n
- WHERE
- 1 = 1
- AND (n.creator_id = '856187440439296' OR (n.id IN ( 11, 22)))
- AND actual_total_user != (
- select CASE WHEN response_type = 1 THEN ( SELECT count(*) FROM noti_visit_log WHERE notification_id = n.id)
- ELSE (SELECT count(*) FROM noti_reply WHERE notification_id = n.id) END
- )
- AND n.tenant_id = 810192326787072
- AND n.type = 1;
上面的两种 case when 表达式的使用在mysql数据库 都成功了。
但是问题就出现在 国产达梦数据库 上执行就有问题了,2.1 是成功的, 2.2 失败了。
我们直接看2.2 执行失败的错误提示信息:
刚开始,我以为是 != 使用报错导致,后来就改成 <> 替换 !=, 但是还是发现有报错。
看来还是这种case when的写法 国产数据库不支持吧。
问题来了,那怎么修改呢 ?!
问题来了,那怎么修改呢 ?!
问题来了,那怎么修改呢 ?!
... ...
那就换一种写法,改用上面的 2.1的写法就可以了。
总结下:
在国产达梦数据库中,使用下面的 case when语句的时候出现报错的问题。sql语法不支持的问题。 参看下表的不同写法:
sql语句 | mysql数据库 | 国产-达梦数据库 |
| 成功 | 成功 |
达梦数据库下执行失败的错误提示: | 成功 | 失败 国产数据库下执行识别,改用下面的写法就可以了 |
| 成功 | 成功 |
这就是今天想说的,国产数据库执行sql,sql语法不支持的问题,如何修改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。