适配信创数据库的人的精神状态 be like

1 月 13 日
 woodfizky

适配过程中发现:如果某个 SQL 的查询条件是 some_col != '',那么返回的结果就会是空

于是做了如下简单实验: SQL

select
    case
        when ('1' != '') then '1'
        when ('1' = '') then '2'
        else 'else'
    end as result_1,
    ('1' = '')::bool as result_2,
    ('1' != '')::bool as result_3,
    ('1' != '' or '1' = '') as always_true_1,
    ('1' != '1' or '1' = '1') as always_true_2

result:

{
  "postgres": {
    "result_1": "2",
    "result_2": false,
    "result_3": true,
    "always_true_1": true,
    "always_true_2": true
  },
  "gaussdb": {
    "result_1": "else",
    "result_2": null,
    "result_3": null,
    "always_true_1": null,
    "always_true_2": true
  }
}

完全不明白为什么 gaussdb 的逻辑是这样的,如果有人知道可以告诉我一下吗?

4884 次点击
所在节点    PostgreSQL
28 条回复
wangYQ
1 月 14 日
信创的数据库还是尽量选兼容 PG 的或者说 从 PG 套皮或者改过来的,起码语法问题能解决。有的缝合怪真的性能还不行,语法还得重新兼容
issakchill
1 月 14 日
之前我们也是要 mysql 转 gaussdb 大概方案已经做好了 当时在 mybatis 的 xml 里面全部加上 mysql 跟 gaussdb 的方言。。。那工作量做得想死
后来甲方良心发现 转成 polardbx 基本无缝切换
visper
1 月 14 日
以前好像试过这个数据库。反正当他是遇到有 null 值啊 null 字段之类的就一定要用 is null,不能等于匹配,否则肯定查不出来之类的。看这上面好像规则就像把''当成 null,然后一等号匹配就直接返回 null.
yeqizhang
1 月 14 日
@visper null 在很多数据库都是特殊的不能用等于号
xiaomushen
1 月 14 日
信创 db 很多语法,都是为了迁就 oracle
PopRain
1 月 14 日
感觉楼主还是见的太少,ORACLE 应该就是这样的,接触过一次很不习惯,反人类
Elietio
1 月 14 日
我们俩数据库,一个 Oracle 兼容模式,一个 MySQL 兼容模式,那酸爽
kkwa56188
1 月 14 日
O 系的, 第一眼看就感觉是 is null 的问题.
这种小知识点, 懂了一次以后就终身懂了, 以后的问题,就留给后人吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1185366

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX