工作中遇到的spark SQL小问题:包含某个或某些字符的条件

时间:2025-03-31 08:21:52

今天又来总结工作中遇到的问题了,今天是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, "线上化") <> 0INSTR 是一个函数,用于返回子字符串在字符串中第一次出现的位置。如果 QD 列包含 “线上化”,则 INSTR(QD, "线上化") 的返回值大于 0;如果不包含,则返回 0。因此,INSTR(QD, "线上化") <> 0 表示 QD 列包含 “线上化”。
  • WHERE QD REGEXP "线上化"REGEXP 是 SQL 中的正则表达式匹配操作符,用于按照正则表达式模式来匹配字符串。“线上化” 是一个简单的正则表达式模式,表示匹配包含 “线上化” 的字符串。正则表达式可以进行更复杂的模式匹配,如字符类、量词、分组等。

性能

  • WHERE QD LIKE '%线上化%':由于 LIKE 操作符使用了通配符 % 在开头,数据库无法使用索引进行快速查找,因此性能通常较差,尤其是在处理大量数据时。
  • WHERE INSTR(QD, "线上化") <> 0INSTR 函数同样无法利用索引进行优化,需要对每一行数据进行全字符串扫描,因此性能也较差。
  • WHERE QD REGEXP "线上化":正则表达式匹配通常比 LIKE 和 INSTR 更复杂,需要更多的计算资源,因此性能可能是三者中最差的。

总结

  • 如果只需要进行简单的模糊匹配,建议使用 LIKE 操作符,因为它的语法简单,性能相对较好。
  • 如果对性能要求不高,且需要使用函数进行更灵活的处理,可以使用 INSTR 函数。
  • 如果需要进行复杂的模式匹配,如匹配特定格式的字符串、进行字符类匹配等,则应使用 REGEXP 操作符。