sql检索文中子段相等判断问题,急盼解决!!!

ufo_ufo 2006-12-14 01:32:47
pl/sql中用到,
传进参数比如i_str可以为空

select * from a 表 where a.t1 = nvl2(i_str, a.t1, i_str)

想实现为空的时候不加这个字段条件,可是为空的时候为什么检索不到数据??

很奇怪!!!
...全文
191 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
adaizi1980 2006-12-14
  • 打赏
  • 举报
回复
按bzszp(SongZip)的方法做,
对于表达式a.t1 = nvl(i_str, a.t1),当i_str不为空时,该表达式等价于a.t1 = i_str;当i_str为空时,该表达式等价于a.t1 = a.t1 ,即a.t1 不为空时该表达式永远为真,等同于可以省略该条件;
需要注意的是,如果a.t1 可能为空,请用nvl(a.t1,'字段不可能是的一个特殊值') = nvl(i_str, nvl(a.t1,'字段不可能是的一个特殊值')),否则,由于oracle不能对两个空值做比较,当i_str为空时,a.t1为空的行会被过滤掉
ufo_ufo 2006-12-14
  • 打赏
  • 举报
回复
我搞错啦,两边长度不一样,给分!!
bzszp 2006-12-14
  • 打赏
  • 举报
回复
哪里有问题?
SQL> select deptno from dept;

DEPTNO
----------
10
20
30
40

SQL> select deptno from dept where deptno = nvl(null,deptno);

DEPTNO
----------
10
20
30
40

SQL> select deptno from dept where deptno = nvl('',deptno);

DEPTNO
----------
10
20
30
40

SQL> select deptno from dept where deptno = nvl('20',deptno);

DEPTNO
----------
20

SQL>
tgm78 2006-12-14
  • 打赏
  • 举报
回复
select * from a 表 where a.t1 = nvl(i_str, a.t1)
当i_str不为空的时候,取的自然是i_str值
bzszp 2006-12-14
  • 打赏
  • 举报
回复
nvl就是个这个功能
ufo_ufo 2006-12-14
  • 打赏
  • 举报
回复
select * from a 表 where a.t1 = nvl(i_str, a.t1)
空值时候可以检索到数据,不为空检索不到的。

???
yuyu1980 2006-12-14
  • 打赏
  • 举报
回复
up
ufo_ufo 2006-12-14
  • 打赏
  • 举报
回复
但是不为空的话我还要这个字段=i_str的值
bzszp 2006-12-14
  • 打赏
  • 举报
回复
select * from a 表 where a.t1 = nvl(i_str, a.t1)

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧