concat_ws和concat都是用于連接字符串的函數,但它們在使用上有一些區別:
一、concat、concat_ws函數格式:
concat格式: concat(參數1,參數2,…參數n),如果要加’分隔符’直接寫在 各參數中間就行
concat_ws格式: concat_ws(分隔符,參數1,參數2,…參數n)
二、兩者區別
- 能否拼接INT類型
concat(1, ‘,’, 2) -> 可以
concat_ws(1, ‘,’, 2) -> 不可以
得知,concat是可以執行成功的。由此得出 concat可以直接將 INT類型拼接成STRING,STRING拼接成STRING 更不再話下了;而concat_ws不可以直接拼接INT類型,它要求拼接的類型 必須都得是STRING類型,才能在hive執行。
樣例(有需要可以自己寫幾個測試):
concat(1, ',', 2) -> 1,2 (STRING類型)
concat_ws(1, ',', 2) -> 報錯
concat_ws報錯:
報錯顯示concat_ws只支持STRING 或者 array
- 拼接NULL
concat(1, null, 2) -> 結果: null
concat_ws(’,’, ‘1’, null, ‘2’) -> 結果:1,2
得知,concat拼接時,只要參數中有null(有一個null即可),不管有多少不為空的參數,結果都為null;concat_ws遇到參數有null時,則會忽略,不會返回null。
樣例(有需要可以自己寫幾個測試):
concat(1, null, 2) -> null
concat_ws(',', '1', null, '2') -> 1,2
-
分隔符的概念:concat_ws函數允許用戶指定一個分隔符(separator),該分隔符將用于在連接字符串時插入到各個字符串之間。這意味著concat_ws函數可以生成帶有分隔符的連接結果,而concat函數則沒有這個功能,它只是簡單地將字符串連接在一起,不考慮任何分隔符。
-
處理NULL值的方式:當concat函數遇到NULL值時,無論其他參數是否為非空,整個結果都將返回NULL。而concat_ws函數在遇到NULL值時則會忽略它,不會因為單個NULL值而導致整個結果返回NULL。這意味著,即使參數中包含NULL,concat_ws也能生成一個有效的連接結果。
-
參數靈活性:concat_ws函數在處理參數時比concat函數更加靈活。concat函數要求所有參數都必須是非空的,否則結果將為NULL。而concat_ws函數則允許參數中包含NULL值,它會在處理時忽略這些NULL值,只連接非NULL的參數。
綜上所述,選擇使用concat還是concat_ws函數取決于具體的需求:如果需要連接字符串并希望它們之間有分隔符,或者希望在參數中包含NULL值時仍然得到一個有效的結果,那么應該使用concat_ws函數。如果不需要分隔符,且可以接受在參數中有NULL時整個結果變為NULL的情況,那么可以使用concat函數。