热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

prestosql报错_那些年坑过我们的SQL

SQL中的NULL值、空值和类型转换我们平常写SQL中遇到过滤空值或者NULL值的处理,尤其是在非关系型数据库中没有唯一键和默认值的约束要求,很容易出现

SQL中的NULL值、空值和类型转换

我们平常写SQL中遇到过滤空值或者NULL值的处理,尤其是在非关系型数据库中没有唯一键和默认值的约束要求,很容易出现NULL值或者空值。很多时候我们总是会出现困扰,到底是该使用=' ' 还是用 is NULL呢?

另外我们一个多表JOIN的查询在这个SQL上跑的好好的,一旦换了一个SQL执行引擎就提示我们JOIN两边的数据类型不一致,这些都是为什么呢?

今天就带大家一起领略一下各类SQL中空值以及类型转换中的那些坑。

一:空值和NULL值

  • 底层字段类型为字符型(string,varchar,char等):

    hive:如果底层存储的是NULL值,我们必须要用 is NULL来判断,如果底层存储的是'  ',则需要使用 =' '来判断。在hive中NULL默认存储为'\N',但是' '存储还是' '。

    presto:与hive保持一致。

    spark:与hive保持一致。

    impala:与hive保持一致。

    mysql:使用上与hive使用保持一致。

  • 底层字段是数值型(int,bigint等)

    hive:由于int类型的数据在hive中默认存储为'\N',所以查询的时候必须要使用is NULL才能取出空的值。

    presto:与hive中保持一致,不能使用='',会报类型错误。

    spark:与hive中保持一致。

    impala:与presto保持一致,只能使用is NULL,使用=''由于后面是字符类型,会报错。

    mysql:与presto保持一致,使用is NULL,不过在mysql中数值类型一般会采用默认值0来填充。

这里需要特别注意的地方是&#xff1a;NULL值是不支持比较的。什么意思呢&#xff0c;比如说有一列ID的值是 NULL&#xff0c;如果使用ID<>&#39;123&#39;是无法把这条记录取出来的&#xff0c;只能使用ID is NULL。当然NULL和NULL比较也是没有意义的。另外空值也不支持与具体的值来比较&#xff0c;使用的时候也要注意&#xff0c;这部分数据需要特殊处理&#xff0c;如&#xff1a;先单独过滤掉或者单独取出来。

二&#xff1a;SQL中的字段类型转换

隐式类型转换&#xff0c;又叫自动类型转换&#xff0c;意思就是当要比较的两个对象(字段)类型不一致是&#xff0c;程序自动调整为一致的情况。通常是支持又小向大(兼容)的类型转换&#xff0c;如从int到bigint或者到string。不过这里并不是绝对的&#xff0c;一般程序会分析两个对象之间的运算符&#xff0c;如果是数值运算符(&#43;-*/)的话再分析对象里面的具体的值&#xff0c;如果可以转为数字计算就会自动转为数字计算。否则的话会SQL可以运行但是结果会是空值。

支持隐式类型转换的SQL语言有&#xff1a;HIVE,SPARK&#xff0c;MYSQL,其中MYSQL如果两边不支持运算的话不一定返回空值&#xff0c;要看具体的情况&#xff0c;例如如果是&#39;张三&#39;&#43;1 &#xff0c;返回结果是1。

显式类型转换&#xff0c;又叫强制类型转换&#xff0c;就是说程序不会自动帮你把两个对象的类型转为一致&#xff0c;需要自己手动显示声明。常用的显示声明有cast(col as type),convert(type col)&#xff0c;一般对cast较为熟悉&#xff0c;各种SQL基本通用。这里需要说明的是理论上有了强制类型转换在所有数据类型之间是可以互转的。但是转换的时候要确保底层数据转换后是有意义的&#xff0c;否则即使可以转&#xff0c;结果也是没有意思甚至是不正确的。

必须使用显式类型转换的SQL&#xff1a;PRESTO,IMPALA。另外需要注意的是mysql在使用强制类型转换的时候如果是把字符串转为数字AS后的类型只支持DECIMAL&#xff0c;SIGNED&#xff0c;UNSIGNED&#xff0c;而不支持其他类型。

通过以上空值的分析&#xff0c;相信大家对SQL中的NULL、空值有了进一步的了解&#xff0c;下次针对具体的数据采用上面的办法就可以确保取出的数据是正确的。通过类型转换的分析&#xff0c;大家在写SQL的时候首先要明确使用的是那种类型的SQL&#xff0c;JOIN的时候两个字段的类型是否一致&#xff0c;这样使用起来才能游刃有余。


备注&#xff1a;以上是本人根据日常工作中及网上相关资料的总结&#xff0c;虽然经过验证但不免某些地方存在瑕疵&#xff0c;如有发现也请大家积极指正&#xff0c;互相学习。

778303767dda9b1ed61b31c004dedcfb.png




推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
author-avatar
潘景洪Phant_255
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有