非常奇怪的问题,关于or语句请教,谢谢

[复制链接]
查看11 | 回复9 | 2014-7-11 07:56:59 | 显示全部楼层 |阅读模式
select decode(b.area_code,0951,'1银川',0952,'2石嘴山',0953,'3吴忠',0954,'4固原',0955,'5中卫',0)"地区",

sum(nvl(send_total_cnt,0)) "发送总条数",
sum(nvl(send_succes_cnt,0)) "发送成功总条数",
sum(nvl(send_fail_cnt,0)) "发送失败总条数",
sum(nvl(receive_total_cnt,0)) "接受总条数",
sum(nvl(receive_success_cnt,0)) "接受成功总条数",
sum(nvl(receive_fail_cnt,0)) "接受失败总条数",
sum(nvl(sett_in_fee,0))/100 "结入金额(元)",
sum(nvl(sett_out_fee,0))/100"结出金额(元)",

sum(nvl(sett_in_fee,0))/100+sum(nvl(sett_out_fee,0))/100 "差额(元)"
from (
select calling_area_code area_code,
called_brand_code,
calling_brand_code,

decode(calling_tsp_code,11,called_tsp_code,calling_tsp_code) sett_tsp,
case when sett_fee0 then sum(NUM_CDRS) end receive_total_cnt,

case when sett_fee>0 and 1=1 then sum(NUM_CDRS) end receive_success_cnt,

case when sett_fee>0 and 1=0 then sum(NUM_CDRS) end receive_fail_cnt,
case when sett_fee>0 then sum(sett_fee) end sett_in_fee,
case when sett_fee0 and product_id=190
and START_DATE>='&sBeginDate'||'00'--YYYYMMDD
and START_DATE22 or a.calling_brand_code22)
------ and a.called_brand_code22
-----and a.calling_brand_code22
and a.area_code(+)=b.area_code
group by decode(b.area_code,0951,'1银川',0952,'2石嘴山',0953,'3吴忠',0954,'4固原',0955,'5中卫',0)
order by decode(b.area_code,0951,'1银川',0952,'2石嘴山',0953,'3吴忠',0954,'4固原',0955,'5中卫',0)
如上面红色标注处语句and (a.called_brand_code22 or a.calling_brand_code22 ),结果查询发现这个or根本没效果,没这个语句查询结果一样!
而单独执行我注释掉的兰色处,语句为and a.called_brand_code22 却可以查出记录,
或者单独执行我注释掉的棕色处,语句为and a.calling_brand_code22 也可以查到结果,
说明or语句起不到效果,请问一下,问题出在哪里,之前我有把这个or都写到子查询里面去了也不行,现在写在外面也不行,奇怪,奇各位高手帮忙看看,谢谢!
[ 本帖最后由 wabjtam123 于 2008-9-24 18:12 编辑 ]
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
不等于与OR连用的时候,是达不到你的效果的.
COL1N时,可能包括COL2N的情况,
同样COL2N时,可能包括COL1N的情况,
所以你的这个OR的句子基本没起作用.
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
ID COL1COL2
1 2019
2 2120
3 2240
4 23 50
SELECT *FROM TAB WHERE COL120 OR COL220
得到的结果是和SELECT *FROM TAB 一样的
唯一能排除的是COL1 =COL2=N的情况
[ 本帖最后由 zhangweicai74 于 2008-9-24 18:27 编辑 ]
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
多谢!那该怎么写呢?
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
楼主和我是一家人啊 你是BOSS的吗?不留神保密协议当心小李同学找你麻烦啊
[ 本帖最后由 zouhu007 于 2008-9-24 19:57 编辑 ]
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
你的右联接不报错吗
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
and (a.called_brand_code22 or a.calling_brand_code22)
这样结果集只剔除a.called_brand_code=22 and a.calling_brand_code=22记录
不明白LZ要取什么?
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
我明白了,今天确实是糊涂了
drop table test;
create table test (col1 int ,col2 int);
insert into test (col1,col2) values (22,19);
insert into test (col1,col2) values (21,22);
insert into test (col1,col2) values (90,40);
insert into test (col1,col2) values (22,22);
commit;
select * from test;
SELECT *FROM test WHERE (col122 and col222);
select * from test where (col122 or col222);
看这样的结果很清楚了,是我自己搞蒙了
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
看错了
[ 本帖最后由 ZERO_SONG 于 2008-9-24 20:57 编辑 ]
回复

使用道具 举报

千问 | 2014-7-11 07:56:59 | 显示全部楼层
原帖由 ZERO_SONG 于 2008-9-24 20:45 发表
OR语句只要第一个条件满足就不执行下面的判断了。

好象也不是这么解释,我现在想起来有点怪怪的,你这样解释就解释不通了,只能用实验大致证明一下结论是这样
SQL>
SQL> drop table test;
Table dropped
SQL> create table test (col1 int ,col2 int);
Table created
SQL> insert into test (col1,col2) values (22,19);
1 row inserted
SQL> insert into test (col1,col2) values (21,22);
1 row inserted
SQL> insert into test (col1,col2) values (90,40);
1 row inserted
SQL> insert into test (col1,col2) values (22,22);
1 row inserted
SQL> commit;
Commit complete
SQL> select * from test;

COL1
COL2
--------------------------------------- ---------------------------------------

22
19

21
22

90
40

22
22
SQL> SELECT *FROM test WHERE (col122 and col222);

COL1
COL2
--------------------------------------- ---------------------------------------

90
40
SQL> select * from test where (col122 or col222);

COL1
COL2
--------------------------------------- ---------------------------------------

22
19

21
22

90
40
SQL>
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行