sql中的null值、空值和型別轉換
我們平常寫sql中遇到過濾空值或者null值的處理,尤其是在非關係型資料庫中沒有唯一鍵和預設值的約束要求,很容易出現null值或者空值。很多時候我們總是會出現困擾,到底是該使用=' ' 還是用 is null呢?
另外我們乙個多表join的查詢在這個sql上跑的好好的,一旦換了乙個sql執行引擎就提示我們join兩邊的資料型別不一致,這些都是為什麼呢?
今天就帶大家一起領略一下各類sql中空值以及型別轉換中的那些坑。
一:空值和null值
這裡需要特別注意的地方是:null值是不支援比較的。什麼意思呢,比如說有一列id的值是 null,如果使用id<>'123'是無法把這條記錄取出來的,只能使用id is null。當然null和null比較也是沒有意義的。另外空值也不支援與具體的值來比較,使用的時候也要注意,這部分資料需要特殊處理,如:先單獨過濾掉或者單獨取出來。
二:sql中的字段型別轉換
隱式型別轉換,又叫自動型別轉換,意思就是當要比較的兩個物件(字段)型別不一致是,程式自動調整為一致的情況。通常是支援又小向大(相容)的型別轉換,如從int到bigint或者到string。不過這裡並不是絕對的,一般程式會分析兩個物件之間的運算子,如果是數值運算子(+-*/)的話再分析物件裡面的具體的值,如果可以轉為數字計算就會自動轉為數字計算。否則的話會sql可以執行但是結果會是空值。
支援隱式型別轉換的sql語言有:hive,spark,mysql,其中mysql如果兩邊不支援運算的話不一定返回空值,要看具體的情況,例如如果是'張三'+1 ,返回結果是1。
顯式型別轉換,又叫強制型別轉換,就是說程式不會自動幫你把兩個物件的型別轉為一致,需要自己手動顯示宣告。常用的顯示宣告有cast(col as type),convert(type col),一般對cast較為熟悉,各種sql基本通用。這裡需要說明的是理論上有了強制型別轉換在所有資料型別之間是可以互轉的。但是轉換的時候要確保底層資料轉換後是有意義的,否則即使可以轉,結果也是沒有意思甚至是不正確的。
必須使用顯式型別轉換的sql:presto,impala。另外需要注意的是mysql在使用強制型別轉換的時候如果是把字串轉為數字as後的型別只支援decimal,signed,unsigned,而不支援其他型別。
通過以上空值的分析,相信大家對sql中的null、空值有了進一步的了解,下次針對具體的資料採用上面的辦法就可以確保取出的資料是正確的。通過型別轉換的分析,大家在寫sql的時候首先要明確使用的是那種型別的sql,join的時候兩個欄位的型別是否一致,這樣使用起來才能游刃有餘。
HBASE的那些報錯那些坑
踏入hadoop生態,就踏入了乙個大坑 書接上回 插入一句,對於hbase的shell介面想要使用退格鍵,需要先把securecrt的 設為linux,然後使用ctrl backspace才行 今天在hbase下執行了hbase shell後,隨手執行了scan table,就想看著玩兒 然後在hb...
那些年面試遇到的坑
在非同步模式下,當我們使用ajax傳送完請求後,可能還有 需要執行。這個時候可能由於種種原因導致伺服器還沒有響應我們的請求,但是因為我們採用了非同步執行方式,所有包含ajax請求 的函式中的剩餘 將繼續執行。如果我們是將請求結果交由另外乙個js函式去處理的,那麼,這個時候就好比兩條執行緒同時執行一樣...
那些年踩過的CSS坑
1 img 標籤中的alt 與title的區別 title 滑鼠滑過時顯示的文字提示。對seo優化的影響 搜尋引擎對理解是通過alt屬性,所以在alt屬性中包含關鍵字的簡要文字說明,也是頁面優化的一部分。2 padding與margin區別 padding是控制項的內容相對控制項的邊緣的邊距,mar...