postgresql如何查询字符串中是否包含某字符?

嘿,你所说的事情是我在做一个项目时发生的。
大约一年前,我在上海帮助一个客户的订单系统。
当时的数据库是PostgreSQL,数据量非常大,有几十万条记录。

当时,客户要求检查订单号是否包含字母“a”。
起初,我使用 LIKE 编写了 SELECT FROM order WHERE order_id LIKE '%a%' 。
这件事进展得相当快。
最后,数据量不大,一秒可以生成上百个对象。
如果客户认为可以的话,就直说吧。

然后有同事问,是不是更正确?想想看,正则表达式是高级的。
我尝试并编写了 ORDER BY SELECT WHERE '%a%' ,它与 '%a%' 类似。
结果,数据库在我运行时挂起一段时间。
那家伙 那将是十秒钟。
看起来,随着数据量的增加,LIKE 可以比相似更好。
这要根据具体情况而定,不能一概而论。

另一种方法是使用 POSITION 函数。
这让我印象很深。
一旦检查字段是否有特殊符号,使用 LIKE 会有点混乱,所以我使用 POSITION。
写法是选择WHERE POSITION('a' IN order_id) > 0。
最直观的感受就是看位置。
如果大于0,则说明有。
然而,如果这个功能使用过多。
查询,尤其是 IN 中指定的字符串,会很慢。
因此,重点必须放在优化上。

所以所有这些方法都取决于你的数据量和你的具体业务情况。
我不看哪一款先进,而是看哪一款速度快,哪一款容易控制。
我已经被困十年了,所以我必须实事求是地看待情况。

SQL如何截取指定字段某一个字符的前面/后面的字符串

上周有一个开发人员问了我这个问题,这让我很困惑……每个数据库的SQL编写方法当然是不同的。
我给大家讲讲我遇到的陷阱。

我们先来谈谈SQL Server。
上次他在上海做一个项目时,他截取了我面前的部分。
在“OPE-CZ-1 08 -003 -SE7 1 .2 ”中。
直接使用SUBSTRING函数,我编写了SUBSTRING(column,1 ,CHARINDEX('.',column)
1 ),结果是“OPE-CZ-1 08 -003 -SE7 1 ”。
这是使用 CHARINDEX 函数的最简单方法,但请注意索引从 1 开始计数,因此在“”下减 1 停止。
截距类似,使用SUBSTRING(column, CHARINDEX(',column) + 1 , LEN(column)),计算长度时结果为“2 ”,用LEN(column)减去位置。

Oracle,我2 02 2 年在北京建了一个系统,写法有点不一样。
使用 SUBSTR 和 INSTR。
例如,SUBSTR(column, 1 , INSTR(column, '.')')
1 ) 上一部分。
但是oracle的INSTR返回的位置是从1 开始的,所以减1 就可以了。
剪切后的第二个也是SUBSTR。
如果我多写这些东西,错误就会少一些。

MySQL更简单,只需使用SUBSTRING_INDEX即可。
上次在深圳测试的时候,我直接用SUBSTRING_INDEX(columns, '.', -1 )作为背景。
如果需要前面,只需 SUBSTRING_INDEX(column, '.', 1 )。
这个函数使用起来极其方便,无论是从0还是1 的位置。

对于,总结来说,核心就是找到并截取字符的位置。
SQL Server 使用 CHARINDEX/LEN,Oracle 使用 INSTR/SUBSTR,MySQL 使用 SUBSTRING_INDEX。
但请注意,该问题发生在2 02 1 年的杭州。
一些数据库对特殊特征的处理方式有所不同。
好像“”之后什么都没有。
在“OPE-CZ-1 08 -003 -SE7 1 .2 ”中,MySQL会报错,但其他两个都没有问题。
因此,在使用该函数时添加一个测试,这样使用 IF('.',column) > 0, ..., NULL) 是安全的。

否则就看你了,我还在考虑特殊功能......

SQL中LEFT和RIGHT函数的截取技巧 左右截取字符串的常见用法

这是一个洞。
直接在 WHERE 子句中使用 LEFT 函数会导致索引崩溃。

实用提醒:为了提高WHERE子句的效率,请使用LIKE运算符而不是LEFT函数来使用索引。