本人最近在做开发的时候,写了如下一段SQLSELECT A.SF_BILL_STATUS
FROM SYSADM.PS_SM_TAX_INV_REG1 A
WHERE A.INVOICE_DT BETWEEN TO_DATE('2013-01-10', 'YYYY-MM-DD') AND
TO_DATE('2013-01-12', 'YYYY-MM-DD')
AND ((A.SF_BILL_STATUS = 'C' AND
A.CANCEL_DT > TO_DATE('2013-01-26', 'YYYY-MM-DD')) OR
A.SF_BILL_STATUS = 'I')很奇怪的是这个OR语句
OR A.SF_BILL_STATUS = 'I
如果删掉OR .. 执行就没问题. 但是加上就有问题
这是去掉OR
这是加上OR
但是如果在SQL后面多加一个条件比如说 AND 1=1或者别的, 就能出数据
多加条件后
实在不能理解,请帮忙解答下谢谢了, DB环境是Oracle 10g, tools: PLSQLPS, 我在OR 条件上加上trim也能出结果.
OR TRIM(A.SF_BILL_STATUS) = 'I' 请问这是为什么呢?
(当然用Union也可以解决, 只是想找到为什么会这样. )
FROM SYSADM.PS_SM_TAX_INV_REG1 A
WHERE A.INVOICE_DT BETWEEN TO_DATE('2013-01-10', 'YYYY-MM-DD') AND
TO_DATE('2013-01-12', 'YYYY-MM-DD')
AND ((A.SF_BILL_STATUS = 'C' AND
A.CANCEL_DT > TO_DATE('2013-01-26', 'YYYY-MM-DD')) OR
A.SF_BILL_STATUS = 'I')很奇怪的是这个OR语句
OR A.SF_BILL_STATUS = 'I
如果删掉OR .. 执行就没问题. 但是加上就有问题
这是去掉OR
这是加上OR
但是如果在SQL后面多加一个条件比如说 AND 1=1或者别的, 就能出数据
多加条件后
实在不能理解,请帮忙解答下谢谢了, DB环境是Oracle 10g, tools: PLSQLPS, 我在OR 条件上加上trim也能出结果.
OR TRIM(A.SF_BILL_STATUS) = 'I' 请问这是为什么呢?
(当然用Union也可以解决, 只是想找到为什么会这样. )
你可以这样试试:
SELECT A.SF_BILL_STATUS FROM SYSADM.PS_SM_TAX_INV_REG1 A
WHERE A.INVOICE_DT BETWEEN TO_DATE('2013-01-10', 'YYYY-MM-DD')
AND TO_DATE('2013-01-12', 'YYYY-MM-DD')
AND ((A.SF_BILL_STATUS = 'C' OR A.SF_BILL_STATUS = 'I') AND A.CANCEL_DT > TO_DATE('2013-01-26', 'YYYY-MM-DD'))
不知道是不是符合您的需求,但是这种才是最直接明了的SQL.
vanjayhsu兄, 照你所说, 那SF_BILL_STATUS='C'的结果应该出来才对啊.
至于增加后又可以查到数据了,你得看看执行计划。我推测是改变了优先级,or的部分就没有执行。
and或or的连接也没问题,还是请楼主把建表和数据的语句发出来,让大家仔细检查下
绝对是你的SF_BILL_STATUS的数据有问题。
仔细查找看看。
(A.SF_BILL_STATUS = 'C' AND
A.CANCEL_DT > TO_DATE('2013-01-26', 'YYYY-MM-DD'))
的结果显示出来才对.minitoy兄, 这段SQL的逻辑没问题, 需要先取 SF_BILL_STATUS = 'C' 并且有时间限制 CANCEL_DT > 2013-01-26. 然后再取 SF_BILL_STATUS = 'I' 的, 对与这个条件是没有时间限制的. 我查过相关的文档, 这两个条件的结果是不会受影响的. 但是这里确实取不出来, 我以为这应该是个BUG. 但是在Metalink上, 查不到相关的信息. 所以还需要数据库的高手来解决这个问题..
另外我猜想数据库里可能有' ' 或者 ' I' 这种情况. 但是我查过他们的长度, 都是1.