本人最近在做开发的时候,写了如下一段SQL
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' 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: PLSQL
PS, 我在OR 条件上加上trim也能出结果.
OR TRIM(A.SF_BILL_STATUS) = 'I'请问这是为什么呢?
(当然用Union也可以解决, 只是想找到为什么会这样. )
------解决方案--------------------
看起来 像 个 10g的bug。。。放到11g里面运行怎么样呢???
------解决方案--------------------
楼主如果知道怎么回事,不妨通知大家一下,我们也想知道为什么。
------解决方案--------------------
请楼主仔细看你的SQL结果,去掉OR的SF_BILL_STATUS='C',你加上OR之后
OR A.SF_BILL_STATUS = 'I还是查SF_BILL_STATUS,但是这个字段的值是C,所以你查询不到结果。你加上其他的条件查询的又是另外一个字段了,所以能查询出结果。
------解决方案--------------------
你同一个字段用AND,又OR,为什么不用直接用括号括起来OR呢?
你可以这样试试:
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.
------解决方案--------------------
#5,同感,查询成功执行了,但没有查询结果。
------解决方案--------------------
把加上了OR A.SF_BILL_STATUS = 'I' 和没有加 OR A.SF_BILL_STATUS = 'I' 这两个sql的执行计划都拿出来先看看。我觉得应该从执行计划上面着手
------解决方案--------------------