SQL如果参数为null,则搜索全部

时间:2014-02-05 12:13:19

标签: sql oracle parameters null

我有一个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

3 个答案:

答案 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,然后使用coalescenull替换为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