当前位置: 首页 > article >正文

【SQL】筛选字符串与正则表达式

目录

语法

需求

示例

分析

代码


语法

SELECT column1, column2, ...  
FROM table_name  
WHERE condition;

WHERE 子句用于指定过滤条件,以限制从数据库表中检索的数据。当你执行一个查询时,WHERE 子句允许你筛选出满足特定条件的记录。如果记录满足 WHERE 子句中的条件,则这些记录会被包含在查询结果中;如果不满足条件,则这些记录会被排除在外。

  • WHERE 子句是在数据被检索之后但在结果被返回之前应用的。这意味着它不会减少数据库需要处理的数据量,但会限制最终返回给客户端的数据量。
  • 在使用 WHERE 子句时,确保条件正确无误,以避免返回错误的数据或意外的空结果集。
  • 对于大型数据库,合理的 WHERE 子句条件可以显著提高查询性能,因为它允许数据库系统更有效地定位和检索数据。
  • 在某些情况下,WHERE 子句可以与 GROUP BYHAVING 等子句结合使用,以实现更复杂的查询和数据聚合。然而,WHERE 子句在数据分组之前过滤记录,而 HAVING 子句在数据分组之后过滤分组。

SELECT column_name(s)

FROM table_name

WHERE column_name REGEXP pattern;

REGEXP(或其变种,如RLIKE,具体取决于数据库系统)是一个强大的文本搜索模式匹配操作符,它允许你使用正则表达式(Regular Expressions)来搜索数据库中的文本数据。正则表达式是一种特殊的文本字符串,用于描述搜索文本时应该匹配的模式。它们非常灵活,可以匹配复杂的文本模式,包括字符序列、字符选择、重复模式等。

  • 性能:使用REGEXP可能会影响查询性能,特别是在大型数据集上。优化你的正则表达式和索引(如果可能的话)可以帮助减轻这种影响。
  • 数据库支持:并非所有数据库系统都支持REGEXP或类似的功能。例如,SQL Server 使用 LIKE 和一些扩展的通配符功能,但不直接支持正则表达式。然而,SQL Server 2016及更高版本引入了TRANSLATESTRING_SPLIT等函数,以及CLR集成,可以间接实现正则表达式功能。对于复杂的正则表达式匹配,你可能需要求助于数据库外的处理(如应用程序代码)。
  • 语法差异:不同的数据库系统(如MySQL、PostgreSQL、Oracle等)在REGEXP的语法和支持的正则表达式特性上可能存在差异。因此,在将REGEXP查询从一个数据库迁移到另一个数据库时,需要特别注意。

正则表达式

^:表示一个字符串或行的开头

[a-z]:表示一个字符范围,匹配从 a 到 z 的任何字符。

[0-9]:表示一个字符范围,匹配从 0 到 9 的任何字符。

[a-zA-Z]:这个变量匹配从 a 到 z 或 A 到 Z 的任何字符。请注意,你可以在方括号内指定的字符范围的数量没有限制,您可以添加想要匹配的其他字符或范围。

[^a-z]:这个变量匹配不在 a 到 z 范围内的任何字符。请注意,字符 ^ 用来否定字符范围,它在方括号内的含义与它的方括号外表示开始的含义不同。

[a-z]*:表示一个字符范围,匹配从 a 到 z 的任何字符 0 次或多次。

[a-z]+:表示一个字符范围,匹配从 a 到 z 的任何字符 1 次或多次。

.:匹配任意一个字符。

\.:表示句点字符。请注意,反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,需要转义反斜杠本身,因此需要使用\\.。

$:表示一个字符串或行的结尾。

需求

表: Users

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| name          | varchar |
| mail          | varchar |
+---------------+---------+
user_id 是该表的主键(具有唯一值的列)。
该表包含了网站已注册用户的信息。有一些电子邮件是无效的。

编写一个解决方案,以查找具有有效电子邮件的用户。

一个有效的电子邮件具有前缀名称和域,其中:

前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线 '_' ,点 '.' 和/或破折号 '-' 。前缀名称 必须 以字母开头。

 为 '@leetcode.com' 。

以任何顺序返回结果表。

结果的格式如以下示例所示:

示例

输入:
Users 表:
+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 2       | Jonathan  | jonathanisgreat         |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
| 5       | Marwan    | quarz#2020@leetcode.com |
| 6       | David     | david69@gmail.com       |
| 7       | Shapiro   | .shapo@leetcode.com     |
+---------+-----------+-------------------------+
输出:
+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
+---------+-----------+-------------------------+
解释:
用户 2 的电子邮件没有域。 
用户 5 的电子邮件带有不允许的 '#' 符号。
用户 6 的电子邮件没有 leetcode 域。 
用户 7 的电子邮件以点开头。

分析

编写一个解决方案,以查找具有有效电子邮件的用户。

需要查找具有符合要求的电子邮件的用户,输出对应的用户id,用户名和邮箱,

一个有效的电子邮件具有前缀名称和域,其中:

前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线 '_' ,点 '.' 和/或破折号 '-' 。前缀名称 必须 以字母开头。

 为 '@leetcode.com' 。

通过where mail regexp +正则表达式检索

^:表示一个字符串或行的开头

$:表示一个字符串或行的结尾

要求,前缀名称 必须 以字母开头,不限制大小写,所以^[a-zA-Z]

可以包含字母(大写或小写),数字,下划线 '_' ,点 '.' 和破折号 '-' ,所以^[a-zA-Z]+[a-zA-Z0-9_.-]*,这里面包含小写字母、大写字母、数字、下划线 '_' 、点 '.' 和破折号 '-'。其中[xxx]*表示一个字符范围,匹配从 a 到 z 的任何字符 0 次或多次。

 为 '@leetcode.com'

后缀或者域为'@leetcode.com',需要写作@leetcode\\.com,然后用$结尾

其中\.:表示句点字符。请注意,反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,需要转义反斜杠本身,因此需要使用\\.。

最终就是where mail regexp '^[a-zA-Z][a-zA-Z0-9_.-]*@leetcode\\.com$'

代码

select *
from Users
where mail regexp '^[a-zA-Z][a-zA-Z0-9_.-]*@leetcode\\.com$'


http://www.kler.cn/a/326900.html

相关文章:

  • Docker打包自己项目推到Docker hub仓库(windows10)
  • 你适合哪种tiktok广告账户类型?
  • 优选算法精品——双指针
  • RV1126-SDK学习之OSD实现原理
  • Linux:网络协议socket
  • Java 实现接口幂等的九种方法:确保系统稳定性与数据一致性
  • 07_矩形圆形绘制
  • 责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例
  • Linux云计算 |【第四阶段】RDBMS1-DAY1
  • EZUIKit.js萤石云vue项目使用
  • Golang plugin包教程:创建与管理插
  • MacOS多桌面调度快捷键
  • 1.1.4 计算机网络的分类
  • 一篇文章快速学会docker容器技术
  • 强化学习-python案例
  • 实现简易 vuedraggable 的拖拽排序功能
  • Java入门3——操作符+String
  • 《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024
  • Vue 3 文件编译流程详解与 Babel 的使用
  • [Uninstall] 软件彻底卸载工具的下载及详细安装使用过程(附有下载文件)
  • C#和数据库高级:虚方法
  • 安卓13禁止待机 永不休眠 android13永不休眠
  • JVM基本组成
  • Redis的数据类型常用命令
  • Python 学习入门笔记
  • smartctl 命令:查看硬盘健康状态