今天又來總結工作中遇到的問題了,今天是SQL,spark引擎
需求描述,篩選渠道包含”線上化“的數據
也就是討論where里面的這個篩選條件怎么寫
一般起手都是
where QD like '%線上化%‘
學習了其他的寫法:
1.INSTR函數
where INSTR(QD,"線上化") <> 0
INSTR函數的介紹:
INSTR
?函數通常用于查找一個子字符串在另一個字符串中首次出現的位置。如果找到子字符串,函數會返回其首次出現的位置(位置從 1 開始計數);如果未找到,函數會返回 0。
2.正則表達式匹配
where QD REGEXP "線上化"
好處在于,如果我的應用場景是包含多個字符串其中一個的
WHERE QD REGEXP '金融科技部|投資銀行部|人力資源部'
|
?表示或關系,意味著只要?QD
?列中的字符串包含 “金融科技部”、“投資銀行部” 或者 “人力資源部” 中的任意一個,就會被篩選出來。
正則表達式的匹配操作通常會比普通的字符串比較操作更耗費資源,所以在處理大量數據時,可能會對性能產生一定影響。
三者的比較,參考豆包的回復
功能
WHERE QD LIKE '%線上化%'
:LIKE
?是 SQL 中用于字符串模糊匹配的操作符。%
?是通配符,表示任意數量(包括零個)的任意字符。因此,'%線上化%'
?表示匹配包含 “線上化” 的任意字符串。它只能處理簡單的通配符匹配,無法進行復雜的模式匹配。WHERE INSTR(QD, "線上化") <> 0
:INSTR
?是一個函數,用于返回子字符串在字符串中第一次出現的位置。如果?QD
?列包含 “線上化”,則?INSTR(QD, "線上化")
?的返回值大于 0;如果不包含,則返回 0。因此,INSTR(QD, "線上化") <> 0
?表示?QD
?列包含 “線上化”。WHERE QD REGEXP "線上化"
:REGEXP
?是 SQL 中的正則表達式匹配操作符,用于按照正則表達式模式來匹配字符串。“線上化” 是一個簡單的正則表達式模式,表示匹配包含 “線上化” 的字符串。正則表達式可以進行更復雜的模式匹配,如字符類、量詞、分組等。
性能
WHERE QD LIKE '%線上化%'
:由于?LIKE
?操作符使用了通配符?%
?在開頭,數據庫無法使用索引進行快速查找,因此性能通常較差,尤其是在處理大量數據時。WHERE INSTR(QD, "線上化") <> 0
:INSTR
?函數同樣無法利用索引進行優化,需要對每一行數據進行全字符串掃描,因此性能也較差。WHERE QD REGEXP "線上化"
:正則表達式匹配通常比?LIKE
?和?INSTR
?更復雜,需要更多的計算資源,因此性能可能是三者中最差的。
總結
- 如果只需要進行簡單的模糊匹配,建議使用?
LIKE
?操作符,因為它的語法簡單,性能相對較好。 - 如果對性能要求不高,且需要使用函數進行更靈活的處理,可以使用?
INSTR
?函數。 - 如果需要進行復雜的模式匹配,如匹配特定格式的字符串、進行字符類匹配等,則應使用?
REGEXP
?操作符。