ANSI_MODE

适用于:检查标记是的砖的SQL

ANSI_MODE配置参数控制内置函数的关键行为和操作。

设置

  • 真正的

    遵循SQL标准在如何处理某些算术运算和类型转换,类似于大多数数据库和数据仓库。遵循这个标准促进更好的数据质量、完整性和可移植性。

  • 砖SQL使用Hive-compatible行为。

你可以设置这个参数在会话级使用设置语句并在全球范围内使用SQL配置参数全球仓库SQL API

系统默认值

系统默认值真正的

详细描述

砖的SQL参考文档描述SQL标准的行为。

以下部分描述ANSI_MODE之间的区别真正的(ANSI模式)(non-ANSI模式)。

运营商

在non-ANSI模式中,算术运算进行数值类型可能会返回溢出或NULL值,而在ANSI模式这样的操作返回一个错误。

操作符

描述

例子

ANSI_MODE = true

ANSI_MODE = false

股息/除数

返回股息除以除数。

1/0

错误

- - - - - - expr

返回的否定价值expr。

- y (-128)

错误

-128 y(溢出)

expr1——expr2

从expr1返回expr2的减法。

-128 y- - - - - -1 y

错误

127 y(溢出)

expr1 + expr2

返回expr1和expr2的总和。

127 y+1 y

错误

-128 y(溢出)

股息%除数

后返回剩余股息/除数。

1%0

错误

乘数*被乘数

收益乘数乘以被乘数。

100 y*100 y

错误

16个y(溢出)

arrayExpr(指数)

返回元素的arrayExpr指数。

无效的数组索引

错误

mapExpr(例子)

返回键mapExpr的价值。

无效的地图的关键

错误

除数div股息

返回该部门的组成部分因子的股息。

1div0

错误

功能

一些内置函数可以是不同的行为在ANSI模式vs non-ANSI模式条件下指定的下面。

操作符

描述

条件

ANSI_MODE = true

ANSI_MODE = false

abs (expr)

返回数值的绝对值expr。

abs (-128 y)

错误

-128 y(溢出)

element_at (mapExpr键)

返回键mapExpr的价值。

无效的地图的关键

错误

element_at (arrayExpr指数)

返回元素的arrayExpr指数。

无效的数组索引

错误

英语教学(指数、expr1 […])

返回第n个表达式。

无效的指数

错误

make_date (y, m, d)

创建一个日期的年、月和日。

无效的结果日期

错误

make_timestamp (y、m, d, h mi, s (tz))

创建一个时间戳字段。

无效的结果时间戳

错误

make_interval (y、m、w d h mi, s)

创建一个区间字段。

无效的结果区间

错误

国防部(股息,除数)

后返回剩余股息/除数。

国防部(1,0)

错误

next_day (expr dayOfWeek)

返回后的第一次约会在dayOfWeek比expr和命名。

无效的星期

错误

parse_url (url, partToExtract [,])

提取一个url的一部分。

无效的URL

错误

pmod(股息,除数)

返回后积极的剩余股息/除数。

pmod (1,0)

错误

大小(expr)

返回的基数expr。

大小(空)

1

to_date (expr (fmt))

返回expr使用一个可选的日期格式。

无效的expr或格式字符串

错误

to_timestamp (expr (fmt))

返回expr使用一个可选的时间戳格式。

无效的expr或格式字符串

错误

to_unix_timestamp (expr (fmt))

返回时间戳在expr UNIX时间戳。

无效的expr或格式字符串

错误

unix_timestamp ([expr (fmt)))

返回当前的UNIX时间戳或指定的时间。

无效的expr或格式字符串

错误

铸造的规则

规则和行为以ANSI模式更为严格。他们可以分为以下三个类别:

编译时转换规则

源类型

目标类型

例子

ANSI_MODE = true

ANSI_MODE = false

布尔

时间戳

铸造(真作为时间戳)

错误

1970-01-0100:00:00.000001UTC

日期

布尔

铸造(日期“2001-08-09”作为布尔型)

错误

时间戳

布尔

(时间戳的1970-01-0100:00:00Z”作为布尔型)

错误

积分数值

二进制

铸造(15作为二进制)

错误

二进制表示

运行时错误

源类型

目标类型

条件

例子

ANSI_MODE = true

ANSI_MODE = false

字符串

Non-string

无效的输入

铸造(' a '作为整数)

错误

数组、结构、地图

数组、结构、地图

无效的输入

铸造(数组(' 1 ',' 2 ',' 3 ')作为数组<日期>)

错误

数字

数字

溢出

演员(12345作为字节)

错误

数字

积分数值

截断

铸造(5.1作为整数)

错误

5

请注意

对于每一个您可以使用try_cast而不是返回而不是一个错误。

隐式类型强制规则

ANSI_MODE=真正的,砖SQL使用清晰SQL数据类型铸造规则:

相比之下ANSI_MODE=不一致和更多的宽容。例如:

  • 当使用一个字符串隐式类型与任何算术运算符、字符串是演员

  • 当比较字符串任何数值类型的字符串是隐式的类型比较。

  • 当执行一个联盟,合并或其他操作,必须找到最常见类型都投字符串如果有任何字符串类型。

砖使用明确的建议try_cast函数而不是依赖ANSI_MODE=

例子

>ansi_mode=真正的;——防止积分数值溢出>选择(12345年作为非常小的整数);铸造12345年非常小的整数原因溢出——为无效值提出了错误,而不是返回NULL。>选择(“一个”作为整数);无效的输入语法类型数字:一个返回而不是,使用“try_cast”两种模式——try_cast()是一致的>选择try_cast(“一个”作为整数);——不允许模糊crosscasting。>选择c1+c2(“5”,“7.6”)作为T(c1,c2);不能解决”(T。c1+T。c2)'由于数据类型不匹配:”(T。c1+T。c2)'需要(数字时间间隔一天第二个时间间隔一年时间间隔)类型,字符串——促进字符串最常见类型(字符串、整数——> BIGINT)算术运算。>选择typeof(5- - - - - -“3”);长整型数字——促进字符串最常见类型(整数、字符串- - >长整型数字)和运行时检查>选择c1=c2(10,“10.1”)作为T(c1,c2);无效的输入语法类型数字:101返回而不是,使用“try_cast”——促进字符串最常见类型(字符串、整数——> BIGINT)设置操作的运行时检查。>选择typeof(c1)(选择5联盟所有选择“6”)作为T(c1);长整型数字长整型数字
>ansi_mode=;——沉默积分数值溢出>选择(12345年作为非常小的整数);57——返回NULL,而不是一个错误>选择(“一个”作为整数);两种模式——try_cast()是安全的>选择try_cast(“一个”作为整数);——允许模糊crosscasting使用双。>选择c1+c2(“5”,“7.6”)作为T(c1,c2);126——Crosscasts字符串为算术运算的两倍。>选择typeof(5- - - - - -“3”);——隐式地将字符串转换为整数将10等同于10.1>选择c1=c2(10,“10.1”)作为T(c1,c2);真正的——促进字符串集合操作>选择typeof(c1)(选择5联盟所有选择“6”)作为T(c1);字符串字符串