【问题标题】:SQL Wildcard QuestionSQL 通配符问题
【发布时间】:2011-06-03 01:36:12
【问题描述】:

抱歉,我是使用数据库的新手 - 我正在尝试执行查询 这将获取与 SQL 中的字符串相似的所有字符。

例如,

如果我要查找以某个字符串开头的所有用户,例如 S* 或 Sm* 会返回“Smith、Smelly、Smiles 等...”

我在这方面走在正确的轨道上吗?

任何帮助将不胜感激,并提前致谢!

【问题讨论】:

  • 注意不同版本的SQL给你不同的选择;但他们都支持%

标签: sql wildcard


【解决方案1】:

LIKE 运算符是您要搜索的内容,因此对于您的示例,您需要类似:

SELECT * 
  FROM [Users]
 WHERE LastName LIKE 'S%'

% 字符是 SQL 中的通配符。

【讨论】:

  • 这就是我要搜索的内容 - 因为我真的需要一些东西来查找名称和其他“以”特定字符串“开头”的字段。抱歉我的措辞不佳。
【解决方案2】:

Sql 不能这样做...把百分比符号放在中间。

SELECT * FROM users WHERE last_name LIKE 'S%th' 

你需要写一个 where 子句和一个 and 子句。

 SELECT * FROM users WHERE last_name LIKE 'S%' and last_name LIKE '%th' 

【讨论】:

    【解决方案3】:

    标准 (ANSI) SQL 有两个用于 LIKE 关键字的通配符:

    • _(下划线)。匹配任何单个字符的一次出现。
    • %(百分号)。匹配零次或多次出现的任何单个字符。

    此外,SQL Server 扩展了 LIKE 通配符匹配以包含字符集规范,就像一个普通的正则表达式字符集说明符:

    • [character-set] 匹配指定集中的单个字符
    • [^character-set] 匹配不在指定集中的单个字符。

    字符集也可以按正常方式指定为范围:

    • [0-9] 匹配任何十进制数字。
    • [A-Z] 匹配任何大写字母
    • [^A-Z0-9-] 匹配任何非字母、数字或连字符的字符。

    字母匹配的语义当然依赖于使用的排序规则。它可能区分大小写,也可能不区分大小写。

    此外,要匹配文字左方括号 ('[]'),您必须使用字符范围说明符。你不会得到语法错误,但你也不会得到匹配。

    where x.field like 'x[[][0-9]]'
    

    将匹配看起来像 'x[0]' 、 'x[8]' 等的文本。但是

    where 'abc[x' like 'abc[x'
    

    永远是假的。

    【讨论】:

      【解决方案4】:

      您可能还喜欢SOUNDEX 的结果,具体取决于您对姓氏相似度的偏好。

      select * 
      from [users]
      where soundex('lastname') = soundex( 'Smith' )
      or upper(lastname) like 'SM%'
      

      【讨论】:

      • 除了 soundex 不是很好(例如,观察到 60% 的误报率)。它旨在匹配英语名称,而不是任意单词。给定任意文本(或字母表的 26 个基本字母之外的文本),它就落在了它的脸上。这是 1917 年的原始专利。google.com/patents/about?id=EbdgAAAAEBAJ&dq=1,261,167
      【解决方案5】:

      您的问题并不完全清楚。

      如果您想要所有姓氏为 Smith 的用户,则可以进行常规搜索:

       SELECT * FROM users WHERE last_name = 'Smith'
      

      如果您希望所有用户都以“S”开头并以“th”结尾,您可以使用 LIKE 和通配符:

       SELECT * FROM users WHERE last_name LIKE 'S%th'
      

      (注意标准 SQL 许多通配符是 '%' 而不是 '*')。

      如果您真的想要“听起来像”匹配,许多数据库都支持一个或多个 SOUNDEX 算法搜索。检查您的特定产品的文档(您在问题中未提及)。

      【讨论】:

        【解决方案6】:

        获取姓氏为 smith 的所有用户

        SELECT * 
          FROM [Users]
         WHERE LastName ='Smith'
        

        要让所有姓氏包含 smith 的用户执行此操作,也会返回 blasmith、smith2 等

        SELECT * 
          FROM [Users]
         WHERE LastName LIKE '%Smith%'
        

        如果您想要以 smith 开头的所有内容,请执行此操作

        SELECT * 
          FROM [Users]
         WHERE LastName LIKE 'Smith%'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-17
          • 2014-10-23
          相关资源
          最近更新 更多