【发布时间】:2008-11-06 06:47:57
【问题描述】:
(注意:这是针对 MySQL 的 SQL,而不是 SQL Server。)
我有一个数据库列,其中包含“abc def GHI JKL”之类的值。我想编写一个 WHERE 子句,其中包括对以特定字母开头的任何单词的不区分大小写的测试。例如,该示例将测试字母 a、c、g、j 是否为真,因为每个字母都以“单词”开头。该应用程序用于提供查找仅包含以指定字母开头的单词的记录的搜索。另请注意,此表没有全文索引。
【问题讨论】:
(注意:这是针对 MySQL 的 SQL,而不是 SQL Server。)
我有一个数据库列,其中包含“abc def GHI JKL”之类的值。我想编写一个 WHERE 子句,其中包括对以特定字母开头的任何单词的不区分大小写的测试。例如,该示例将测试字母 a、c、g、j 是否为真,因为每个字母都以“单词”开头。该应用程序用于提供查找仅包含以指定字母开头的单词的记录的搜索。另请注意,此表没有全文索引。
【问题讨论】:
您可以使用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 方言中保持不变。
【讨论】:
使用 REGEXP 运算符:
SELECT * FROM `articles` WHERE `body` REGEXP '[[:<:]][acgj]'
它返回列体包含以 a、c、g 或 i 开头的单词的记录(不区分大小写)
但请注意:如果您期望负载很重(不使用索引 - 它扫描每一行!),这不是一个好主意!
【讨论】:
查看 MySQL 参考手册的 Pattern Matching 和 Regular Expressions 部分。
【讨论】: