MySql 中的通配符类型
Types of Wildcards in MySql
我的查询:
Select * From tableName Where columnName Like "[PST]%"
没有给出预期的结果。
为什么这个通配符在 MySql 中不起作用?
如果要过滤包含 'P'
、'S'
或 'T'
的字符串,则可以使用正则表达式:
where col rlike '[PST]'
如果您想要包含子字符串 'PST'
的字符串,则不需要方括号 - like
就足够了:
where col like '%PST%'
如果您想要字符串开头的匹配字符,则正则表达式解决方案如下所示:
where col rlike '^PST'
like
选项为:
where col like 'PST%'
MySQL 的 LIKE 语法记录在此处:https://dev.mysql.com/doc/refman/8.0/en/pattern-matching.html
几十年前的标准 SQL 只定义了两个通配符:%
和 _
。如果 SQL 产品想说它们符合 SQL 并支持 LIKE
谓词,那么这些是唯一需要支持的通配符。
%
匹配零个或多个任意字符。它类似于正则表达式中的.*
。
_
恰好匹配任意一个字符。它类似于正则表达式中的.
。
此外,如果您想匹配字面值“%”或“_”,您需要将其转义,即在其前面加一个反斜杠:
WHERE title LIKE 'The 7\% Solution'
Microsoft SQL 服务器的 LIKE 语法记录在此处:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver15
它们支持 %
和 _
通配符,以及 \
转义字符,但它们用其他两种形式扩展了标准 SQL:
[a-z]
匹配一个字符,但只匹配括号内范围内的字符。这在正则表达式中是相似的。 -
是范围运算符,除非它出现在括号内字符串的开头或结尾。
[^a-z]
匹配一个字符,该字符必须 而不是 是括号内范围内的字符之一。正则表达式也一样。
这些不是 LIKE
谓词的标准通配符形式,其他品牌的 SQL 数据库不支持它们。
SQL 标准的更高版本引入了一个新的谓词 SIMILAR TO
,它支持更丰富的模式和通配符,因为 right-side 操作数是一个包含正则表达式的字符串。但是由于这个谓词是在后来的 SQL 标准版本中引入的,一些实现已经开发了自己的几乎相同的解决方案。
MySQL调用了运算符REGEXP
和RLIKE
是同义词(https://dev.mysql.com/doc/refman/8.0/en/regexp.html).
在 https://bugs.mysql.com/bug.php?id=746 中要求支持 SIMILAR TO
语法以帮助 MySQL 遵守 SQL 标准,但该请求被拒绝了,因为它巧妙地与现有 REGEXP
/RLIKE
运算符不同的行为。
Microsoft SQL 服务器在 LIKE
运算符中部分支持正则表达式通配符,还有一个 dbo.RegexMatch()
函数。
SQLite 有一个 GLOB
运算符,依此类推。
谢谢大家!
具体这个问题,我们需要用到正则表达式
Select * 来自 tableName Where ColumnName Regexp "^[PST]";
有关正则表达式的更多详细信息,即 Regexp:
我的查询:
Select * From tableName Where columnName Like "[PST]%"
没有给出预期的结果。
为什么这个通配符在 MySql 中不起作用?
如果要过滤包含 'P'
、'S'
或 'T'
的字符串,则可以使用正则表达式:
where col rlike '[PST]'
如果您想要包含子字符串 'PST'
的字符串,则不需要方括号 - like
就足够了:
where col like '%PST%'
如果您想要字符串开头的匹配字符,则正则表达式解决方案如下所示:
where col rlike '^PST'
like
选项为:
where col like 'PST%'
MySQL 的 LIKE 语法记录在此处:https://dev.mysql.com/doc/refman/8.0/en/pattern-matching.html
几十年前的标准 SQL 只定义了两个通配符:%
和 _
。如果 SQL 产品想说它们符合 SQL 并支持 LIKE
谓词,那么这些是唯一需要支持的通配符。
%
匹配零个或多个任意字符。它类似于正则表达式中的.*
。
_
恰好匹配任意一个字符。它类似于正则表达式中的.
。
此外,如果您想匹配字面值“%”或“_”,您需要将其转义,即在其前面加一个反斜杠:
WHERE title LIKE 'The 7\% Solution'
Microsoft SQL 服务器的 LIKE 语法记录在此处:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver15
它们支持 %
和 _
通配符,以及 \
转义字符,但它们用其他两种形式扩展了标准 SQL:
[a-z]
匹配一个字符,但只匹配括号内范围内的字符。这在正则表达式中是相似的。 -
是范围运算符,除非它出现在括号内字符串的开头或结尾。
[^a-z]
匹配一个字符,该字符必须 而不是 是括号内范围内的字符之一。正则表达式也一样。
这些不是 LIKE
谓词的标准通配符形式,其他品牌的 SQL 数据库不支持它们。
SQL 标准的更高版本引入了一个新的谓词 SIMILAR TO
,它支持更丰富的模式和通配符,因为 right-side 操作数是一个包含正则表达式的字符串。但是由于这个谓词是在后来的 SQL 标准版本中引入的,一些实现已经开发了自己的几乎相同的解决方案。
MySQL调用了运算符REGEXP
和RLIKE
是同义词(https://dev.mysql.com/doc/refman/8.0/en/regexp.html).
在 https://bugs.mysql.com/bug.php?id=746 中要求支持 SIMILAR TO
语法以帮助 MySQL 遵守 SQL 标准,但该请求被拒绝了,因为它巧妙地与现有 REGEXP
/RLIKE
运算符不同的行为。
Microsoft SQL 服务器在 LIKE
运算符中部分支持正则表达式通配符,还有一个 dbo.RegexMatch()
函数。
SQLite 有一个 GLOB
运算符,依此类推。
谢谢大家!
具体这个问题,我们需要用到正则表达式
Select * 来自 tableName Where ColumnName Regexp "^[PST]";
有关正则表达式的更多详细信息,即 Regexp: