ANSI_MODE

適用於:檢查標記是的磚的SQL

ANSI_MODE配置參數控製內置函數的關鍵行為和操作。

本文描述了ANSI模式磚SQL。磚的ANSI合規運行時看到的在磚ANSI的合規運行時

設置

  • 真正的

    遵循SQL標準在如何處理某些算術運算和類型轉換,類似於大多數數據庫和數據倉庫。遵循這個標準促進更好的數據質量、完整性和可移植性。

  • 磚SQL使用Hive-compatible行為。

你可以設置這個參數在會話級使用設置語句並在全球範圍內使用SQL配置參數或者是SQL API倉庫

係統默認值

係統默認值真正的對賬戶添加磚SQL 2022.35及以後。

詳細描述

磚的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);字符串字符串