我有一个JSF页面,用户可以通过五个选项进行搜索,并可以选择他们搜索的选项中有多少(0-5)。数据库没有NULL值。
目前我有一段可怕的代码来构建SQL语句,但我想只有一个参数化语句。
SELECT *
FROM table1
WHERE col1 = 'dave'
AND col2 = 'Smith'
AND col3 = '3/2/2014'
AND col4 = '12345'
AND col5 = '67890'
ORDER BY col5 DESC
有没有办法检测搜索条件中的空/空值,例如col5 ='' 然后返回该列的所有结果?
因此,如果搜索条件仅为col1='dave'
,那么该语句就像输入
SELECT *
FROM table1
WHERE col1 = 'dave'
ORDER BY col5 DESC
答案 0 :(得分:2)
你可以在SQL中执行此操作:
SELECT *
FROM table1
WHERE (col1 = @col1 or @col1 is null) and
(col2 = @col2 or @col2 is null) and
. . .
ORDER BY col5 DESC;
但是,你可能不想这样做。如果您使用索引来加速搜索,那么使用or
会阻碍在许多数据库中使用索引(但显然不在Oracle中)。 coalesce()
也是如此,可以用作:
WHERE col1 = coalesce(@col1, col1) and
col2 = coalesce(@col2, col2) and
. . .
如果您仍在构建查询,请在语句中执行此操作。逻辑如下:
if @col1 is not null then
@where = concat(@where, " and col1 = '", @col1, "'")
end if;
if @col2 is not null then
@where = concat(@where, " and col2 = '", @col2, "'")
end if;
这将构造可以使用可用索引的正确where
子句。
这种方法有一个缺点。您无法为所有参数值预编译语句。每次输入新值时都需要重新创建该语句(这通常是可接受的开销量,因为您正在处理用户输入)。
答案 1 :(得分:0)
尝试使用trim
将空值''
更改为null
,然后使用coalesce
将null
替换为col5
的值为SELECT *
FROM table1
WHERE col1 = 'dave'
AND col2 = 'Smith'
AND col3 = '3/2/2014'
AND col4 = '12345'
AND col5 = coalesce(trim('67890'),col5)
ORDER BY col5 DESC
以下
{{1}}
答案 2 :(得分:0)
SELECT * FROM table1 WHERE (col1 = :col1 OR :col1 IS NULL) AND (col2 = :col2 OR :col2 IS NULL) AND (col3 = :col3 OR :col3 IS NULL) AND (col4 = :col4 OR :col4 IS NULL) AND (col5 = :col5 OR :col5 IS NULL) ORDER BY col5 DESC
使用命名参数代替“?”更方便在JAVA