【问题标题】:Why some of the results for SQL query containing certain alphabets are missing?为什么缺少包含某些字母的 SQL 查询的某些结果?
【发布时间】:2020-12-15 14:34:59
【问题描述】:

我有下表

当我运行以下查询时,它应该显示所有包含“s”的讲师姓名,但它没有。 我写的查询:

SQL> SELECT instructor_name
  2  FROM instructor
  3  WHERE instructor_name LIKE '%s%';

结果是:

这里有什么问题? Balbir Silakar 和 Saurav Pangeni 不应该也出现在结果中吗?

【问题讨论】:

  • 似乎使用了区分大小写的排序规则。要么指定不区分大小写的排序规则,要么使用 LOWER(),例如WHERE lower(instructor_name) LIKE '%s%'.
  • 看起来你的表是区分大小写的,即's' <> 'S'
  • 您正在寻找“s”,从技术上讲,“S”是不同的东西

标签: sql oracle where-clause sql-like


【解决方案1】:

如果您的列有区分大小写的排序规则,'s''S' 是两个不同的东西。

唉,Oracle 不提供不区分大小写的like 版本(在其他数据库中通常称为ilike)。

你可以这样做:

where instructor_name like '%s%' or instructor_name like '%S%' 

或者:

where lower(instructor_name) like '%s%' 

或者,您可以使用regexp_like();它需要第三个参数,可用于使搜索不区分大小写。

where regexp_like(instructor_name, 's', 'i')

我不会对正则表达式是三个选项中最快的选项感到惊讶。

【讨论】:

    【解决方案2】:

    正如其他人所提到的,s (chr(115)) 和 S (chr(83)) 是两个不同的东西,在“Balbir Silakar”或“Saurav Pangeni”中没有 s

    从 Oracle 12.2 你可以使用

    where instructor_name collate binary_ci like '%s%';
    

    您还可以使用

    忽略重音符号
    where instructor_name collate binary_ai like '%s%';
    

    【讨论】:

      【解决方案3】:

      您的数据库(我认为默认情况下)区分大小写,因此 LIKE 匹配机制区分大小写。这些名称包含一个大写的 S。

      这是一个关于如何使搜索不区分大小写的问答。 Perform a Case insensitive Like query in a case sensitive SQL Server database

      【讨论】:

      • 你确定 OP 使用的是 MS SQL Server 吗? (我不认识屏幕图像。)
      【解决方案4】:

      对于不区分大小写的检查,使用 regexp_like

      where regexp_like(instructor_name , 's', 'i');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-30
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 2011-01-04
        • 2019-06-11
        相关资源
        最近更新 更多