登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: [sqlite]sqlite中的 null 处理及超级陷阱     [回主站]     [分站链接]
[sqlite]sqlite中的 null 处理及超级陷阱
clq
浏览(239) - 2019-12-29 23:19:36 发表 编辑

关键字:

[sqlite]sqlite中的 null 处理及超级陷阱

一个非常特殊的例子:某个数字字段,查询大于某个值的数据时会出现空白值。第一个反应就是加 isnull 这样的值替换函数。
但 isnull 是 mssql 的函数,而 sqlite 中要换用 ifnull ,不过函数倒是一样的。所以可以得到以下语句:

select * from t1 where f1>800

--------------------------------------------------
关于 sqlite 的 null 还有这样的语句。
... WHERE SALARY IS NOT NULL
... WHERE SALARY IS NULL

NULL 值在选择数据时会引起问题,因为当把一个未知的值与另一个值进行比较时,结果总是未知的,且不会包含在最后的结果中。 -- 这个和其他数据库一致。

--------------------------------------------------
但是,遗憾的是这样仍然不能解决我们的问题。原因在于 sqlite 中有一个超级大 bug ,当然它自己的说法是功能,不是 bug 。那就是任何字段都可以存放不属于它声明中的类型的数据,意思就是说字符串字段中可以放数据,更可怕的是数字字符中可以存放一串中文字符串!!!

所以当你看到数字字段中有空白想用 ifnull 去替换,不见得能成功,用 is null 也不一定成功,你还要判断它和空白字符串的对比!!! 所以还要加上以下的比较子句:
and f1<>''
考虑长度大于 1 的值还要用上
and trim(f1)<>''
为了优化查询速度,实际上你要用
and f1<>'' and trim(f1)<>''

同时 trim 的那个要写在后面 ... 这是非常标准的查询优化,不过就是不知道 sqlite 是否有判断式优先的概念 ...


另外,据我所知,很多国内的数据库管理员以及各种各样的程序员对 sql 的优化技术掌握上基本上是 0 ...
看着那些各地重要的程序内部驳斥着这些 sql 我心情真的很沉重,很多人都是把程序功能写出来就完了。你要是花时间去优化了,也许老板或者上司还会嫌弃你做得慢。 -- 这就是现在中国大地上的结果导向式编程,也不知道什么时候会有改变,我估计我是看不到那一天了。当然了,不止程序这一行,我想肯定现时的中华大地上还有很多行当也是这样做事的 ...





总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录
sqlite开发文档 更多



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1