【问题标题】:JPQL / SQL query: where like '%' include null valuesJPQL / SQL 查询:其中 '%' 包括空值
【发布时间】:2012-12-29 16:13:17
【问题描述】:

我有一个简单的 JPQL 查询。 (但这也适用于 sql 查询..)

FROM DomainObj d where d.field1 like 'TEST%' and d.field2 like '%';

如果数据库包含以下行:

1) 字段1 -> '测试';字段2 -> 空

查询不返回任何内容!

如果数据库包含以下值:

2) 归档1 -> '测试';字段2->''

查询返回行!

如何在搜索类似 '%' 的同时包含空值,使查询尽可能简单(避免和/或子句?)

我正在数据库中实现实体的搜索功能..我还同时搜索许多字段..

谢谢 马可

【问题讨论】:

  • null 通常表示没有值,因此LIKE '%' 返回这些行是没有意义的。
  • 我更倾向于将其视为“未知”
  • 你的代码是否完整?还是您简化了给我们举个例子? and d.field2 like '%' 无关紧要,因为正如您提到的那样,field2 上的任何值都将匹配(null 除外)

标签: mysql sql database hibernate jpql


【解决方案1】:

你不能在相等性测试中直接使用 null,因为 null 不等于一切,包括它自己。这就是为什么会有is null 测试,例如:

select null = null -> null
select null <> null -> null
select 1 = null -> null
select 1 <> null -> null
select 1 + null -> null

基本上 null 是具有传染性的,并且会将任何与它进行比较或添加到其中的东西都无效化。

所以是的,你必须这样做

SELECT ... WHERE somefield LIKE '%...%' or somefield IS NULL

【讨论】:

    【解决方案2】:

    试试这个:

    ...
    and IFNULL(d.field2, '') like '%'
    

    【讨论】:

    • 我做了一些测试,我认为这对我来说是最好的解决方案。但我找不到这个功能。我试着搜索!
    • 我的错,NVL() 是 Oracle 函数。我已经修复了我的答案,以便使用 IFNULL() 函数。这是 MySQL 的等价物。
    【解决方案3】:
    ...
    where ...
    and (field2 = '' or field2 is null)
    

    请注意,条件 field2 like '%' 是无意义的,因为它匹配除 null 之外的任何文本。如果您将or field2 is mull 添加到其中,您将匹配所有内容,因此从逻辑上讲,您应该删除 field2 上的条件

    【讨论】:

    • 不知道为什么没有人投票赞成。这让我免于犯一个不合逻辑和愚蠢的错误。
    【解决方案4】:

    使用IS NULL:

    where d.field1 like 'TEST%' OR d.field2 IS NULL;
    

    【讨论】:

      【解决方案5】:
      FROM DomainObj d where (d.field1 like 'TEST%' or d.field1 IS NULL) and (d.field2 like '%' or d.field2 IS NULL)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-23
        • 2017-09-27
        • 2013-09-17
        • 1970-01-01
        • 2013-11-13
        • 1970-01-01
        相关资源
        最近更新 更多