SQL(MySQL):匹配字符串中任何单词的首字母?

Posted

技术标签:

【中文标题】SQL(MySQL):匹配字符串中任何单词的首字母?【英文标题】:SQL (MySQL): Match first letter of any word in a string? 【发布时间】:2008-11-06 06:47:57 【问题描述】:

(注意:这是针对 mysql 的 SQL,而不是 SQL Server。)

我有一个数据库列,其中包含“abc def GHI JKL”之类的值。我想编写一个 WHERE 子句,其中包括对以特定字母开头的任何单词的不区分大小写的测试。例如,该示例将测试字母 a、c、g、j 是否为真,因为每个字母都以“单词”开头。该应用程序用于提供查找仅包含以指定字母开头的单词的记录的搜索。另请注意,此表没有全文索引。

【问题讨论】:

【参考方案1】:

您可以使用LIKE 操作。如果您的单词是空格分隔的,请在字符串的开头附加一个空格,让第一个单词有机会匹配:

SELECT
  StringCol
FROM
  MyTable
WHERE
  ' ' + StringCol LIKE '% ' + MyLetterParam + '%'

MyLetterParam 可能是这样的:

'[acgj]'

要查找不仅仅是空格作为单词分隔符,您可以扩展该技术。以下将 TAB、CR、LF、空格和 NBSP 视为单词分隔符。

WHERE
  ' ' + StringCol LIKE '%['+' '+CHAR(9)+CHAR(10)+CHAR(13)+CHAR(160)+'][acgj]%'

这种方法具有作为标准 SQL 的优点。它将在主要 SQL 方言中保持不变。

【讨论】:

它应该是 CONCAT(' ',StringCol),某些 mysql 版本不能很好地与 + 运算符相加 我不知道 - 感谢您的提示! (您还可以添加一些上下文吗?哪些版本/情况可能有问题?)【参考方案2】:

使用 REGEXP 运算符:

SELECT * FROM `articles` WHERE `body` REGEXP '[[:<:]][acgj]'

它返回列体包含以 a、c、g 或 i 开头的单词的记录(不区分大小写)

但请注意:如果您期望负载很重(不使用索引 - 它扫描每一行!),这不是一个好主意!

【讨论】:

谢谢!奇迹般有效。我添加了一个使用索引。估计扫描整个索引比扫描整个表更好。 注意:这不适用于多字节字符dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp【参考方案3】:

查看 MySQL 参考手册的 Pattern Matching 和 Regular Expressions 部分。

【讨论】:

以上是关于SQL(MySQL):匹配字符串中任何单词的首字母?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Perl 中将字符串中每个单词的首字母大写?

python中如何提取单词的首字母

如何使用 JavaScript 将字符串中每个单词的首字母大写?

将字符串中的三个单词的首字母转化成大写

将一句英文中每个单词的首字母大写,其余字母小写。

仅从 varchar 字段中选择单词的首字母