我有一個字串變數存盤hive如下
stringvar
AA1,BB3,CD4
AA12,XJ5
我想計算(并過濾)正則運算式模式\w\w\d出現的次數。在示例中,在第一行中顯然有三個這樣的示例。我怎樣才能做到這一點而不訴諸橫向視圖和stringvar(太昂貴)的爆炸?
謝謝!
uj5u.com熱心網友回復:
您可以按模式拆分字串并計算結果陣列的大小 - 1。
演示:
select size(split('AA1,BB3,CD4','\\w\\w\\d'))-1 --returns 3
select size(split('AA12,XJ5','\\w\\w\\d'))-1 --returns 2
select size(split('AAxx,XJx','\\w\\w\\d'))-1 --returns 0
select size(split('','\\w\\w\\d'))-1 --returns 0
如果列可以為空,則應特別小心。例如像這樣(取決于您在 NULL 的情況下需要回傳的內容):
select case when col is null then 0
else size(split(col,'\\w\\w\\d'))-1
end
或者簡單地使用 NVL 函式將 NULL 轉換為空字串:
select size(split(NVL(col,''),'\\w\\w\\d'))-1
上面的解決方案是最靈活的一種,你可以統計出現的次數并將其用于復雜的過濾/加入/等。
如果您只需要過濾具有固定模式出現次數或至少固定數量的記錄,并且不需要知道確切的計數,那么不進行拆分的簡單 RLIKE 是最便宜的方法。
例如檢查至少 2 次重復:
select 'AA1,BB3,CD4' rlike('\\w\\w\\d ,\\w\\w\\d ') --returns true, can be used in WHERE
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363143.html
上一篇:檢查最后4行的值
下一篇:如何計算字典理解中單詞的出現次數
