Postgresql字符串检索关键是和符号 LIKE, ESCAPE, ILIKE, ~, ~*, !~, !~* 的含义和区别

本文详细介绍了postgreSQL中用于字符串检索的关键字和符号,包括LIKE、ESCAPE、ILIKE、正则表达式匹配等,并提供了具体的使用案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做了一个关于postgreSQL相关的项目,个人工作中遇到了关于字符串检索的一些处理,以下是个人对字符串检索关键是和符号 LIKE, ESCAPE, ILIKE, ~, ~*, !~, !~*的理解,不正之处还请指出微笑


LIKE

Select * from test where varchar like ‘_a%’; varchar匹配任何a前有一个字符的字符串。

‘_’与’%’为通配符。’_’匹配任意一个字符,’%’匹配0至多个任意字符。

ESCAPE

Select* from test where varchar like ‘b_a%’escape ‘b’; varchar 匹配任何以’_a’开头的字符串。

ESCAPE 'escape_character' 允许在字符串中搜索通配符而不是将其作为通配符使用。

请注意反斜杠在字符串文本里已经有特殊含义了,所以如果你写一个包含反斜杠的模式常量,那你就要在 SQL 语句里写两个反斜杠。因此,写一个匹配单个反斜杠的模式实际上要在语句里写四个反斜杠。你可以通过用 ESCAPE 选择一个不同的逃逸字符来避免这样;这样反斜杠就不再是 LIKE 的特殊字符了。但仍然是字符文本分析器的特殊字符,所以你还是需要两个反斜杠。
我们也可以通过写成 ESCAPE '' 的方式关闭逃逸机制,这时,我们就不能关闭下划线和百分号的特殊含义。
例子: 查找数据库中表的名字(查找以tbl_开头的表的名字)
select tablename from pg_tables where tablename like 'tbl!_%'ESCAPE '!';
利用escape转义: 上面的sql语句中就是将!作为转义字符,作用是将"_"转换成普通的"_"

ILIKE

Select * from test where varchar  ilike ‘_a%’; varchar匹配任何a或者A前有一个字符的字符串。

与Like相比,ILike忽略大小写。

 

正则表达式匹配操作符

~  匹配正则表达式,大小写相关

Select * from test where varchar  ~ ‘ab‘; varchar匹配任何包含’ab’的字符串。

 

~* 匹配正则表达式,大小写无关

Select * from test where varchar ~‘AB‘;varchar匹配任何包含’ab’、’aB’、’Ab’、’AB’的字符串。

与’ ~’相比,忽略大小写。

 

!~  不匹配正则表达式,大小写相关

Select * from test where varchar  ~ ‘a‘; varchar匹配任何不包含’a’的字符串。

 

!~* 不匹配正则表达式,大小写无关

select * from test where varchar !~* ‘A‘; varchar匹配任何不包含’a’和’A’的字符串。
<think>好的,我需要解决用户的问题:如何在查询中排除包含“ZZ”字符串的记录。首先,我应该回忆一下SQL中用于字符串匹配的操作符,通常LIKENOT LIKE是常用的。用户提到的是排除包含ZZ的记录,所以应该用NOT LIKE '%ZZ%'这样的条件。 接下来,我需要确认不同的数据库系统是否有差异。比如引用[2]中提到,AccessSQL Server在模糊查询时使用的通配符不同,Access用的是'?''*',而SQL Server使用'_''%'。用户的问题没有指定数据库类型,所以应该给出通用的方法,并提醒可能存在数据库差异的情况。 然后,考虑示例代码。用户可能需要一个基本的SQL语句模板,比如: SELECT * FROM 表名 WHERE 字段名 NOT LIKE '%ZZ%'; 还要注意大小写敏感的问题,有些数据库默认不区分大小写,而有些则需要额外设置。比如在PostgreSQL中,可以使用ILIKE来不区分大小写,但LIKE是区分大小写的。这部分可能需要提到,但用户的问题中没有明确,所以可以简要说明。 另外,引用[1]提到使用GROUP BY代替DISTINCT,但这里的问题是关于过滤,所以可能不需要涉及。不过,如果用户有性能问题,可能需要考虑索引的使用,比如在相关字段上建立索引来优化查询速度。 还需要考虑转义字符的情况,如果ZZ中包含特殊字符如%,需要使用转义字符处理。例如,如果用户想排除的是%ZZ%,则需要对%进行转义,但这里用户的问题比较简单,可能不需要涉及,但可以作为高级提示。 最后,总结步骤:确定字段表名,使用NOT LIKE通配符,注意数据库差异,处理大小写,考虑性能优化。同时,提供示例代码注意事项,确保用户能够正确应用。</think>在SQL查询中排除包含特定字符串(如ZZ)的记录,可以通过`NOT LIKE`运算符配合通配符实现。以下是具体方法及注意事项: --- ### **步骤说明** 1. **基础语法** 使用`NOT LIKE`条件筛选不包含目标字符串的字段值。 ```sql SELECT * FROM 表名 WHERE 字段名 NOT LIKE '%ZZ%'; ``` - `%`是通配符,表示任意字符出现任意次数(包括0次) - `%ZZ%`匹配任何位置包含`ZZ`的字符串,`NOT LIKE`则排除这些记录 2. **大小写敏感处理** - **区分大小写的数据库**(如PostgreSQL默认):`LIKE`严格匹配大小写,需用`ILIKE`进行不区分大小写的匹配 ```sql SELECT * FROM 表名 WHERE 字段名 NOT ILIKE '%zz%'; ``` - **不区分大小写的数据库**(如MySQL默认):直接使用`LIKE`即可 3. **性能优化** - 若字段上有索引,`LIKE '%ZZ%'`可能无法使用索引,导致全表扫描[^3] - 若需高频查询,可考虑使用全文检索或函数索引(如PostgreSQL的`GIN`索引) --- ### **完整示例** ```sql -- 排除"description"字段包含"ZZ"的记录 SELECT id, product_name, description FROM products WHERE description NOT LIKE '%ZZ%'; ``` --- ### **注意事项** 1. **通配符差异** - **Access数据库**:使用`*`代替`%`,例如`NOT LIKE '*ZZ*'`[^2] - **SQL Server/MySQL/PostgreSQL**:统一使用`%` 2. **转义特殊字符** 若目标字符串包含`%`或`_`,需用转义字符处理: ```sql -- 排除包含"10%ZZ"的记录(假设转义符为'\') SELECT * FROM 表名 WHERE 字段名 NOT LIKE '%10\%ZZ%' ESCAPE '\'; ``` 3. **与`GROUP BY`配合使用** 若需去重且优化性能,可用`GROUP BY`代替`DISTINCT`[^1]: ```sql SELECT description FROM products WHERE description NOT LIKE '%ZZ%' GROUP BY description; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值