2

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

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

如果数据库包含以下行:

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

查询什么也不返回!

如果 DB 包含以下值:

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

查询返回行!

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

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

谢谢马可

4

5 回答 5

8

您不能在相等测试中直接使用 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
于 2013-01-15T14:30:13.350 回答
2

尝试这个:

...
and IFNULL(d.field2, '') like '%'
于 2013-01-15T14:30:22.757 回答
1
...
where ...
and (field2 = '' or field2 is null)

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

于 2013-01-15T14:30:16.767 回答
0

使用IS NULL

where d.field1 like 'TEST%' OR d.field2 IS NULL;
于 2013-01-15T14:30:25.627 回答
0
FROM DomainObj d where (d.field1 like 'TEST%' or d.field1 IS NULL) and (d.field2 like '%' or d.field2 IS NULL)
于 2013-01-15T14:30:45.627 回答