【问题标题】:SQL Like and Wildcard with Oracle SQL Developer使用 Oracle SQL Developer 的 SQL Like 和通配符
【发布时间】:2021-02-10 17:00:43
【问题描述】:

我在后端 Oracle DB 上使用 SQL Developer。我有一个记录,其中买家的名字是 Pete Hansen。

我为什么要尝试

select * from data1 where buyer = 'Pete Hansen';

我得到了结果,没问题。但是,当我使用以下内容时,我没有得到任何结果:

select * from data1 where buyer  like 'Pete Hansen';

另外,当我尝试以下操作时,我没有得到任何结果

select * from data1 where buyer like 'Pete Hans_n';

但以下方法效果很好:

select * from data1 where buyer like 'Pete Hans_n%';

你能帮我理解吗?提前致谢。

【问题讨论】:

标签: sql oracle-sqldeveloper wildcard sql-like


【解决方案1】:

您的buyer 列似乎定义为char;可以看到问题转载in this db<>fiddle,但是当栏目is varchar2不行。

documentation for character comparison 解释了空白填充或非填充比较语义之间的区别。当你将它们与= 进行比较时,因为列和字符串文字都是`char,所以使用了空白填充语义:

使用空格填充语义,如果两个值的长度不同,那么 Oracle 首先在较短的值的末尾添加空格,使它们的长度相等。 ...如果两个值没有不同的字符,那么它们被认为是相等的。此规则意味着如果两个值仅在尾随空格的数量上有所不同,则它们是相等的。仅当比较中的两个值都是数据类型 CHAR、NCHAR、文本字面量的表达式或 USER 函数返回的值时,Oracle 才使用空白填充的比较语义。

当列是 `varchar2 时,使用非填充语义:

使用非填充语义,... 如果两个长度相等的值没有不同的字符,则认为这些值相等。只要比较中的一个或两个值的数据类型为 VARCHAR2 或 NVARCHAR2,Oracle 就会使用非填充比较语义。

LIKE 的工作方式不同。只有带有% 的最终模式匹配,因为这允许char 值中的尾随空格,而其他两个模式则不允许。对于varchar2 版本,其他两个模式也没有任何尾随空格。

需要或想要使用char 列是不寻常的; varchar2 更常见。 Tom Kyte opined on this 多年前。

【讨论】:

    【解决方案2】:

    我怀疑它可能与尾随空格有关,like 运算符不会原谅,但 = 会。要测试它,请尝试

    select * from data1 where trim(buyer) like 'Pete Hansen';
    

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多