今天又来总结工作中遇到的问题了,今天是SQL,spark引擎
需求描述,筛选渠道包含”线上化“的数据
也就是讨论where里面的这个筛选条件怎么写
一般起手都是
sql">where QD like '%线上化%‘
学习了其他的写法:
1.INSTR函数
sql">where INSTR(QD,"线上化") <> 0
INSTR函数的介绍:
INSTR
函数通常用于查找一个子字符串在另一个字符串中首次出现的位置。如果找到子字符串,函数会返回其首次出现的位置(位置从 1 开始计数);如果未找到,函数会返回 0。
2.正则表达式匹配
sql">where QD REGEXP "线上化"
好处在于,如果我的应用场景是包含多个字符串其中一个的
sql">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
操作符。