最新要闻
- 外企持续加码,中国引资磁力不减
- 迷你身材 好吃小巧!和路雪可爱多冰激凌大促:一支到手1.14元
- 《原子之心》DLC IGN6分:能看到冰箱诺拉还不错
- 100%当季采摘 洽洽每日坚果89元1.5斤官方大促
- 小米平板6 Max绝配!小米智能触控键盘来了 米粉:这就是个笔记本
- 印度被截胡!时隔近半个世纪后:俄罗斯将重返月球
- 上海警方破获油卡诈骗案:骗子骗取预付款,20余名司机受骗30余万元
- PC需求回升:英特尔处理器销量增加 AMD遇阻、台式机显卡越来越少人买
- 数度哽咽 王传福首次展示脆弱 比亚迪终成一哥
- 通用汽车遭遇电池供应危机 CFO:承认电车产量难以提升
- QLC闪存立功 三星公开256TB SSD硬盘:1000TB也不远了
- 500万元!重庆丰华股份收到迁入注册地政府补助
- 四川李家沟北锂矿勘查权限时竞价落锤10.1亿元 较起拍价升值1771倍
- iPhone 15最受期待的五大升级!网友:花更多钱也得买高配版
- 理想称30-50万主流SUV只有自家配空悬+CDC!智己汽车不服:在线回怼
- 左眼跳财不靠谱!女子眼皮跳了半年多竟是眼睑痉挛
手机
![顺络电子:董事长部分股权办理股票质押业务](http://www.viltd.com/uploadfile/2022/0610/20220610103218963.jpg)
顺络电子:董事长部分股权办理股票质押业务
![深圳7月二手住宅成交2259套,中介称近期咨询客户开始增加](http://www.viltd.com/uploadfile/2022/0610/20220610103218963.jpg)
深圳7月二手住宅成交2259套,中介称近期咨询客户开始增加
- 顺络电子:董事长部分股权办理股票质押业务
- 深圳7月二手住宅成交2259套,中介称近期咨询客户开始增加
- 最新洪水形势如何?时隔多年为何又见洪水?解答来了!
- 李明俊在调研白龟湖科创新城和环湖路建设工作时强调 勇于担当负责 善于创新突破 着力打造群众满意的放心工程
- 遮天:东荒两大家族登场,庞博成为妖王,妖族公主颜如玉绝美登场
- 京运通: 我司自扩产硅片业务以来,所有单晶炉均为自供
家电
GaussDB(DWS)函数不同写法引发的结果差异
本文分享自华为云社区《GaussDB(DWS)函数结果差异案例之greatest》,作者: 你是猴子请来的救兵吗。
GaussDB(DWS)支持多种兼容模式,为了兼容目标数据库,各模式之间或多或少存在一些行为差异。这里分享一个mysql兼容模式下的表达式函数因不同写法引发的结果差异案例。
【资料图】
问题背景
问题版本GaussDB 8.1.1
问题描述
用户反馈mysql兼容模式下,以下两条sql的执行结果存在差异:select greatest(1,2,100,-1,0,nvl(null,0)) 出来的结果是 2select greatest(1,2,100,-1,0) 出来结果是 100
场景再现
mysql=# select greatest(1,2,100,-1,nvl(null,0));greatest----------2(1 row)mysql=# select greatest(1,2,100,-1,0,0);greatest----------100(1 row)
根因分析
1,不知道小伙伴们有没有注意到,这两个结果集的显示一个是靠左的一个是靠右的;ok,我们先来确认下这两个结果的数据类型:
mysql=# select pg_typeof(greatest(1,2,100,-1,nvl(null,0)));pg_typeof-----------text(1 row)mysql=# select pg_typeof(greatest(1,2,100,-1,0));pg_typeof-----------integer(1 row)
2,依靠pg_typeof我们拿到了返回结果的数据类型;这就说明第一条语句是以text类型进行排序选择最大值的,依次为(‘0’,‘1’,’-1’,‘100’,‘2’),因此我们得到最大值是字符串类型的’2’。
01-11002
3,依次类推,第二条语句是以int类型进行排序选择最大值的,依次为(-1,0,1,2,100),因此我们得到最大值是数值类型的100。
-1012100
4,表达式函数greatest的返回类型是基于入参类型确定的,这里的差异是由于第五个入参类型导致的结果差异。
mysql=# select pg_typeof(nvl(null,0));pg_typeof-----------text(1 row)mysql=# select pg_typeof(0);pg_typeof-----------integer(1 row)
5,而nvl/greatest之所以会出现不同的返回类型,是由mysql兼容模式下的类型匹配规则决定的。
具体规则可参考:UNION,CASE和相关构造。
修改建议
针对此差异场景,建议在不确定返回类型时显式指定其入参类型,将nvl(null,0)改为nvl(null,0)::int,这样结果就是已int排序的,与另一台语句预期相符。
mysql=# select greatest(1,2,100,-1,nvl(null,0)::int);greatest----------100(1 row)
知识剖析
SQL UNION构造把不相同的数据类型进行匹配输出为统一的数据类型结果集。因为SELECT UNION语句中的所有查询结果必须在一列里显示出来,所以每个SELECT子句中的元素类型必须相互匹配并转换成一个统一的数据类型。同样的要求广泛存在于UNION、ARRAY和CASE、COALESCE、IF、IFNULL和GREATEST、LEAST和NVL等表达式和函数中。
GaussDB(DWS)支持多种兼容模式,不同兼容模式下的类型匹配规则也不尽相同。为了便于理解,这里仅以mysql兼容模式下IFNULL的类型匹配规则进行举例说明,它与GREATEST在mysql兼容模式下的规则是一致的。
规则1:如果所有输入都是相同的类型,不包括unknown类型,那么解析成所输入的相同数据类型。
mysql=# select pg_typeof(1),pg_typeof(2);pg_typeof | pg_typeof-----------+-----------integer | integer(1 row)mysql=# select ifnull(1,2),pg_typeof(ifnull(1,2));ifnull | pg_typeof--------+-----------1 | integer(1 row)
规则2:如果所有输入都是unknown类型则解析成text类型。(常量字符串就是unknow类型)
mysql=# select pg_typeof("1"),pg_typeof("2");pg_typeof | pg_typeof-----------+-----------unknown | unknown(1 row)mysql=# select ifnull("1","2"),pg_typeof(ifnull("1","2"));ifnull | pg_typeof--------+-----------1 | text(1 row)
规则3:如果输入是unknown类型和某一非unknown类型,则解析成该非unknown类型。
mysql=# select pg_typeof(current_date),pg_typeof("20230801");pg_typeof | pg_typeof-----------+-----------date | unknown(1 row)mysql=# select ifnull(current_date,"20230801"),pg_typeof(ifnull(current_date,"20230801"));ifnull | pg_typeof------------+-----------2023-08-10 | date(1 row)
规则4:如果存在多种非unknown类型,将enum类型当做text类型,再进行比较。
mysql=# create type gender as enum("boy","girl");CREATE TYPEmysql=# select pg_typeof("boy"::gender),pg_typeof("girl"::varchar);pg_typeof | pg_typeof-----------+-------------------gender | character varying(1 row)mysql=# select ifnull("boy"::gender,"girl"::varchar),pg_typeof(ifnull("boy"::gender,"girl"::varchar));ifnull | pg_typeof--------+-----------boy | text(1 row)
规则5:如果输入类型是同一个类型范畴,则选择该类型的优先级较高的类型。如果是不同的类型范畴,则解析成text类型。
--相同类型范畴mysql=# select pg_typeof(1),pg_typeof(2.0);pg_typeof | pg_typeof-----------+-----------integer | numeric(1 row)mysql=# select ifnull(1,2.0),pg_typeof(ifnull(1,2.0));ifnull | pg_typeof--------+-----------1 | numeric(1 row)--不同类型范畴mysql=# select pg_typeof(1),pg_typeof(current_date);pg_typeof | pg_typeof-----------+-----------integer | date(1 row)mysql=# select ifnull(1,current_date),pg_typeof(ifnull(1,current_date));ifnull | pg_typeof--------+-----------1 | text(1 row)
规则6:把所有输入转换为所选的类型。如果从给定的输入到所选的类型没有隐式转换则失败。
--json不存在到text的隐式转换mysql=# select pg_typeof(1),pg_typeof("{"a":1}"::json);pg_typeof | pg_typeof-----------+-----------integer | json(1 row)mysql=# select ifnull(1,"{"a":1}"::json),pg_typeof(ifnull(1,"{"a":1}"::json));ERROR: IFNULL could not convert type json to textLINE 1: select ifnull(1,"{"a":1}"::json),pg_typeof(ifnull(1,"{"a":1}...^CONTEXT: referenced column: ifnull--可以尝试显式指定类型转换mysql=# select ifnull(1,"{"a":1}"::json::text);ifnull--------1(1 row)
点击关注,第一时间了解华为云新鲜技术~
关键词:
-
-
-
-
GaussDB(DWS)函数不同写法引发的结果差异
未来世界的数字幻境:VR 科技的崭新篇章
外企持续加码,中国引资磁力不减
迷你身材 好吃小巧!和路雪可爱多冰激凌大促:一支到手1.14元
《原子之心》DLC IGN6分:能看到冰箱诺拉还不错
100%当季采摘 洽洽每日坚果89元1.5斤官方大促
小米平板6 Max绝配!小米智能触控键盘来了 米粉:这就是个笔记本
印度被截胡!时隔近半个世纪后:俄罗斯将重返月球
上海警方破获油卡诈骗案:骗子骗取预付款,20余名司机受骗30余万元
PC需求回升:英特尔处理器销量增加 AMD遇阻、台式机显卡越来越少人买
数度哽咽 王传福首次展示脆弱 比亚迪终成一哥
通用汽车遭遇电池供应危机 CFO:承认电车产量难以提升
QLC闪存立功 三星公开256TB SSD硬盘:1000TB也不远了
500万元!重庆丰华股份收到迁入注册地政府补助
四川李家沟北锂矿勘查权限时竞价落锤10.1亿元 较起拍价升值1771倍
iPhone 15最受期待的五大升级!网友:花更多钱也得买高配版
理想称30-50万主流SUV只有自家配空悬+CDC!智己汽车不服:在线回怼
左眼跳财不靠谱!女子眼皮跳了半年多竟是眼睑痉挛
国产OLED份额首破40% 韩国又一个垄断性优势产业岌岌可危:京东方追赶三星
首发2699元 米家空调巨省电2匹发布:高效低噪风道
近5个交易日46家公司获机构调研 宏发股份最受关注
169元 联想小新105W三口氮化镓适配器开售:3设备同时充
国内需求复苏 中芯国际40nm、28nm工艺已满载:供应链正在洗牌
“怀孕后腋下变黑生儿子”是真的吗?
宁德时代进军二手车业务?已为二手车检测平台查博士最大股东
别慌!国内油价下一轮只是小涨 预计上调0.10元/升
上海立达学院继续教育学院航空空乘招生是统招吗?
聊聊语言模型与知识图谱
监控keepalived_vip控制容器的状态
限时8折!《30XX》游戏支持中文 中文界面好评
福特中国大召回:超7万辆车有起火风险
买1得12:京东+腾讯视频等12项联合会员限时238元(价值1425元)
售27980元 春风新车450CL-C摩托上市:外挂“声浪放大器”
福耀大学将完工!曹德旺捐款100亿成理事长:赚很多钱还给社会 每个学生补贴5万
雷军揭秘年度演讲重磅内容:当年一个决定改变了一生
大豪科技8月11日快速反弹
未来几天“热”力十足,注意防暑降温
《C++ GUI Qt4编程》第2章——创建对话框——深入介绍信号和槽
资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回
公安部提醒:有效保护个人信息 做到“三个不”
长城汽车CTO:中国汽车怎么在一起?还是先打一架吧
俄罗斯“月球-25”号发射全程视频公布:预计8月21日着陆 比印度早两天
CPU开销骤降95%!Edge团队宣布改进网页Office应用
主打“硬派+智能” 2024款坦克300上市 售19.98万起
贴脸特斯拉Model Y 开打价格战!极氪001最高降价3.7万元
内蒙古兴安盟那达慕开幕 20余万中外游客感受草原文化
厄瓜多尔总统宣布全国进入紧急状态大选如期举行
全球首个商用核电小堆核心模块“玲龙之心”吊装成功:全球领先
你贡献没?月赚40万 BBA人争相入职!蔚来销售回应高薪 是很高、但太夸张
镉怎么读 镝怎么读
上半年地方财政收入同比增长 中西部省份增速领先
魅族20/20 PRO正式升级Flyme 10.2稳定版!手机、车机合二为一
经典IP动画《忍者神龟:变种大乱斗》今日上映:成龙配音神龟师傅
女子租房一年没扔过垃圾 每天在垃圾堆里睡、玩手机:场面网友看吐
首辆FF 91本周末正式交付!贾跃亭再成老赖 下周回国遥遥无期
美媒称月球上可能已存在生命!俄罗斯“月球-25”号探测器发射升空:时隔47年重返月球
星帅尔:与比亚迪的合作持续顺利推进中
选读SQL经典实例笔记22_2版增补
vivo或首发全球最快内存!海力士LPDDR5T已完成验证
北京:152架次无人机为灾区空投应急物资
世界级汽车品牌成了!比亚迪达成第500万辆新能源汽车下线
闭眼买!已有1000多位米粉下单小米MIX Fold 3
为了保存人类文明火种 艺术家要把30000件作品送上月球
首发139元 小米发布米家理发器2:锋利曜黑刀头
14代i5-14600KF挤牙膏:单核性能提升5.5%
警惕“李鬼”基金!多家公司发声提醒投资者谨防诈骗|基金观察
[数论第三节]高斯消元法/求组合数/卡特兰数
200飙到1300 国庆假期有酒店涨价5倍:你还出去玩吗?
下班后微信办公算加班吗?法院判了
大众为何选择小鹏?背后原因分析
女子花12888元抢自助餐年卡 当事人:一天只要35元
网传上海迪士尼有小孩子在漂流中跳船?不实!
共享单车能载娃了 郑州将投放9000辆共享亲子车
稀土等被制约下!美国开始疯抢“白色石油”
女子翻看去世爸爸手机后破防了:爸爸收藏夹里全是我
全球最快LPDDR5T内存登场!全大核CPU架构天玑9300完成性能验证
吴忠交通投资开发有限公司2023年度购置纯电动新能源公交车项目公开招标
记录一个,百度云直链解析的方法和地址
后缀数组C++详解
买车就送“地下室”!五菱宝骏云朵上市:9.58万起
顶级奢华!布加迪Chiron Golden Era官图发布:配8.0T W16大心脏
长城汽车进军印尼市场 多款智能新能源亮相车展
农业和植保专家组深入一线指导防灾减灾救灾
一天吃掉430吨面条,苏州要为苏式面制定地方标准
男子目不斜视闯红灯被撞还需负全责 官方提醒:等三分不抢一秒
首发1999元 JBL冲击波五代蓝牙音箱上架:20小时长续航
想买电车?等一等宁德时代发布会再说
淘宝用户又回来了!阿里巴巴:核心业绩全面超预期
县城整治医药腐败 数百人主动退赃 网友:希望从严处置别自罚三杯!
财政部、水利部紧急下达15亿元水利救灾资金 支持受灾地区做好水利水毁设施修复工作
年度性能之王Redmi K60至尊版稳了!员工:友商等着瞧吧
阿里组织变革后首份财报发布:2024第一财季营收2341.6亿元 增长14%
大梁+四驱 后排还有2米纯平大床!全新哈弗H5开启预订
Dota2发布周边商城运营事故处理公告:涉事人员调离
月活8.77亿!淘宝稳居电商平台第一
七大车企组成充电联盟“死磕”特斯拉
《人脸识别技术应用安全管理规定(征求意见稿)》,需要关注三个焦点
【车载测试】CAN协议、CAN- FD协议和FlexRay协议 区别
损害工商界利益 扰乱产业链供应链——美国对外投资审查行政令引发质疑和担忧
西蒙尼专访:今夏没和若昂谈过;不认为他在马竞有所保留