【问题标题】:SQL like search string starts with类似 SQL 的搜索字符串以
【发布时间】:2013-02-01 05:18:52
【问题描述】:

学习 SQL。有一个带有字段标题的简单桌面游戏。我想根据标题进行搜索。如果我有一个名为Age of Empires III: Dynasties 的游戏,并且我使用LIKE 和参数Age of Empires III: Dynasties,一切正常,搜索返回具有该名称的记录。但是如果我用Age of Empires III 搜索,它不会返回任何记录:

SELECT * from games WHERE (lower(title) LIKE 'age of empires III');

这不会返回任何东西。我应该用其他东西代替LIKE吗?

我正在使用 MySQL。

【问题讨论】:

    标签: sql


    【解决方案1】:
    SELECT * from games WHERE (lower(title) LIKE 'age of empires III');
    

    上述查询不返回任何行,因为您正在寻找任何行中都不存在的“帝国时代 III”确切字符串。

    因此,为了与具有 'age of empires' 作为子字符串的不同字符串匹配此字符串,您需要使用 '%your string goes here%'

    更多关于mysql string comparision

    你需要试试这个

    SELECT * from games WHERE (lower(title) LIKE '%age of empires III%');
    

    在 Like '%age of empires III%' 中,这将在您的行中搜索任何匹配的子字符串,并将显示在结果中。

    【讨论】:

    • LIKE右侧的字符串包含大写字符,这会匹配转换为小写的字符串吗?
    • 这取决于列/数据库的排序规则。为了安全起见,您可以使用 SELECT * from games WHERE (lower(title) LIKE lower('%age of Empires III%'));
    • 你不是说SELECT * from games WHERE (lower(title) LIKE lower('%age of Empires iii%'));
    • 这将搜索字符串中出现的任何内容,而不仅仅是在问题标题的开头!
    【解决方案2】:

    你需要使用通配符%

    SELECT * from games WHERE (lower(title) LIKE 'age of empires III%');
    

    【讨论】:

    • 这似乎会更快,因为它只是从一开始就搜索匹配项。
    【解决方案3】:

    除了使用%age of empires III 小写是age of empires iii,所以你的查询应该是:

    select *
    from games
    where lower(title) like 'age of empires iii%'
    

    【讨论】:

    • 这是一种安全的方法,但如果使用默认 CI 排序规则,则可能需要。
    【解决方案4】:

    COLLATE UTF8_GENERAL_CI 将作为忽略大小写。 使用:

    SELECT * from games WHERE title COLLATE UTF8_GENERAL_CI LIKE 'age of empires III%';
    

    SELECT * from games WHERE LOWER(title) LIKE 'age of empires III%';
    

    【讨论】:

      【解决方案5】:

      如果您使用不带 % 的“like”运算符,则 like 将作为等号 (=) 起作用,这意味着您的代码将如下所示:

      select * from games where lower(title)= 'age of empires iii';
      

      所以它没有找到任何匹配的数据然后什么也没有返回。

      但是,如果您只想将标题的一部分与您的参数进行比较,则应使用 % 符号。 您可以在不同的位置使用它,这取决于数据库的逻辑。

      一般用在参数的开头和结尾,代码如下:

      select * from games where lower(title) like '%age of empires iii%';
      

      这将搜索标题列中的值,即使开头或结尾或两者都有不匹配的字符。它将搜索的重要条件是值作为参数发送给 like 运算符(在这种情况下,该值是“帝国时代 iii”)在标题字段的某处找到(在这种情况下,标题是“帝国时代 III : Dynasties"),且此条件为真,因此将返回该行以及任何其他具有相同大小写的行。

      【讨论】:

        【解决方案6】:

        在 SQL 中,%---% 匹配中间的任何字符。 select * from table_name where column_name line '%kk%'; 将匹配任何包含 'ss' 的字符串 例如:

        • llsll
        • sll 如果要匹配字符串的开头,则应改用 'ss%'。 select * from table_name where column_name line 'ss%'; 这个查询将只返回 ssll。

        【讨论】:

          猜你喜欢
          • 2014-10-02
          • 1970-01-01
          • 2014-08-15
          • 1970-01-01
          • 2013-09-23
          • 1970-01-01
          • 2017-04-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多