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

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

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

【问题讨论】:

    标签: sql mysql


    【解决方案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 开头的单词的记录(不区分大小写)

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

    【讨论】:

    【解决方案3】:

    查看 MySQL 参考手册的 Pattern MatchingRegular Expressions 部分。

    【讨论】:

      猜你喜欢
      • 2019-08-14
      • 2017-10-09
      • 2016-02-15
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多