请教一个sql的写法!

[复制链接]
查看11 | 回复9 | 2008-10-24 13:12:17 | 显示全部楼层 |阅读模式
本帖最后由 tam509 于 2012-3-8 11:05 编辑
SELECT *
FROM t
WHERE字段1 LIKE '%'||nvl(参数1,'xxxxxxxxxxxxxxxxx')||'%'
OR 字段2 LIKE '%'||nvl(参数2,'xxxxxxxxxxxxxxxxx')||'%'
OR 字段3 LIKE '%'||nvl(参数3,'xxxxxxxxxxxxxxxxx')||%';
需求是这样的:用户可以输入3个参数中的任意一个,两个或三个全输入。然后能查询出匹配的记录。
现在的问题是,如果用户输入 参数1 正确,但是输入 参数2 错误,因为是用的 or,所以还是会把满足参数1的结果显示。
但实际应该是参数1和参数2同时满足的记录才显示。
请问该如何修改sql呢?谢谢

回复

使用道具 举报

千问 | 2008-10-24 13:12:17 | 显示全部楼层
本帖最后由 tam509 于 2012-3-8 11:05 编辑


回复

使用道具 举报

千问 | 2008-10-24 13:12:17 | 显示全部楼层
用动态sql
回复

使用道具 举报

千问 | 2008-10-24 13:12:17 | 显示全部楼层
动态sql的话,如何判断用户传了几个参数呢?还是用like?
回复

使用道具 举报

千问 | 2008-10-24 13:12:17 | 显示全部楼层
http://www.oracle.com/technetwor ... 9asktom-090487.html
回复

使用道具 举报

千问 | 2008-10-24 13:12:17 | 显示全部楼层
SELECT *
FROM t
WHERE(1 = DECODE(字段1,NULL,1,0) or 字段1 LIKE '%'||nvl(参数1,'')||'%')
and(1 = DECODE(字段2,NULL,1,0) or 字段2 LIKE '%'||nvl(参数2,'')||'%')
and(1 = DECODE(字段3,NULL,1,0) or 字段3 LIKE '%'||nvl(参数3,'')||'%');
回复

使用道具 举报

千问 | 2008-10-24 13:12:17 | 显示全部楼层
看看这段SQL是不是你想要得~
DECLARE
v_ename emp.ename%type;
v_nameemp.ename%type;
v_deptno emp.ename%type;
v_no emp.deptno%type;
v_jobemp.job%type;
v_jemp.job%type;
v_sal emp.ename%type;
cursorc_emp is
select ename,sal,deptno,job
fromemp
where emp.ename like upper(v_ename)
and emp.deptno like v_deptno
and emp.job like upper(v_job)
order by sal desc;
BEGIN
v_ename:='&name';
v_deptno:='&no';
v_job :='&j';
for c_p1 in c_emp loop
dbms_output.put_line('姓名:'||rpad(c_p1.ename,6)||''||'工资:'||rpad(c_p1.sal,6)||'部门:'||rpad(c_p1.deptno,2)||'职位:'||c_p1.job);
end loop;
END;
回复

使用道具 举报

千问 | 2008-10-24 13:12:17 | 显示全部楼层



回复

使用道具 举报

千问 | 2008-10-24 13:12:17 | 显示全部楼层
呵呵 新手上路 请多关照
回复

使用道具 举报

千问 | 2008-10-24 13:12:17 | 显示全部楼层
popzhujun 发表于 2012-3-8 15:21
呵呵 新手上路 请多关照

你没答到点子上,参见5楼的链接。
楼主的逻辑其实是AND不是OR。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行