本人在做一个动态条件的查询,根据前面一个条件是否成立而决定下一个条件,
下面是一个例子
偶用的测试表是Oracle自带的emp表查询是否有ename='SCOTT'条件的记录,
若有则条件为ename='SCOTT',
否则条件为ename='SCOTT' or ename='SMITH'
下面的SQL语句可以正常运行,查询结果为ename='SCOTT' or ename='SMITH'
select decode((select count(ename) from scott.emp where ename='SCOTT'), 0, 'ename=' || '''SCOTT''', 'ename=' || '''SCOTT''' || ' or ename=' || '''SMITH''')
from dual 但是我用下面的SQL查询,即在查询emp表的同时用decode把条件放在后面却不行
select * from scott.emp
where decode((select count(ename) from scott.emp where ename='SCOTT'), 0, 'ename=' || '''SCOTT''', 'ename=' || '''SCOTT''' || ' or ename=' || '''SMITH''')
提示“无效的关系运算符”,不知道是什么原因

解决方案 »

  1.   

    觉得你好像打算用decode生成where子句这种做法在静态sql中不可行考虑用动态sql吧
      

  2.   

    SELECT *
    FROM scott.emp
    WHERE ((SELECT COUNT(*) FROM scott.emp WHERE ename='SCOTT')>0 AND ename='SCOTT')
    OR ((SELECT COUNT(*) FROM scott.emp WHERE ename='SCOTT')=0 AND (ename='SCOTT' OR ename='SMITH'))
      

  3.   

    晕, where后面肯定是不能这样用的,要么是true,要么是false.
    都提示“无效的关系运算符”,不管你怎么绕最后必须得回到true,false上.
      

  4.   

    同意boydgmx(梦霄)
    用动态sql
      

  5.   

    select * from emp where ename='scott' or (ename='smith' and not exist(select 1 from emp where ename='scott'))
      

  6.   

    select * from scott.emp
    where ename=decode((select count(ename) from scott.emp where ename='SCOTT'), 0, ''SMITH'', ''SCOTT'')