案例语句在 PSQUERY Where 子句中不起作用
Posted
技术标签:
【中文标题】案例语句在 PSQUERY Where 子句中不起作用【英文标题】:Case Statement not working in PSQUERY Where Clause 【发布时间】:2013-11-18 13:18:30 【问题描述】:我有一个字段帐单类型 ID,其中假设 x、y 和 z 值。账单类型 ID 是一个提示,条件是当 psquery 运行时,如果账单类型 ID 值为空,那么它应该返回账单类型 ID 为 x、y 和 z 的所有行。
下面是case Statement和Decode函数写的:
(CASE
WHEN A.BILL_TYPE_ID = ' ' THEN A.BILL_TYPE_ID LIKE ' %'
ELSE A.BILL_TYPE_ID = :3
END ))
编辑(来自评论):
SELECT
C.NAME1,
TO_CHAR(A.FROM_DT,'YYYY-MM-DD'),
B.LINE_SEQ_NUM,
B.IDENTIFIER,
B.DESCR,
B.GROSS_EXTENDED_AMT,
A.INVOICE_AMOUNT,
C.SETID,
C.CUST_ID
FROM PS_BI_HDR A, PS_BI_LINE B, PS_CUSTOMER C
WHERE
(
A.BUSINESS_UNIT = B.BUSINESS_UNIT
AND A.INVOICE = B.INVOICE
AND A.BILL_TO_CUST_ID = C.CUST_ID
AND A.BUSINESS_UNIT = :1
AND A.BILL_STATUS = :2
AND
(
A.BILL_TYPE_ID =
(
CASE
WHEN A.BILL_TYPE_ID = ' ' THEN A.BILL_TYPE_ID LIKE ' %'
ELSE A.BILL_TYPE_ID = :3
END
)
)
) ORDER BY 1, 3
使用上面的 case 语句,我收到错误:缺少关键字,我无法调试缺少哪个关键字。请指教。
Decode(:3,' ','%',:3)
使用解码功能我没有收到错误,但是当账单类型 ID 为空白时,它不会返回任何行。请帮忙。
【问题讨论】:
请向我们展示完整的声明。CASE
子句中的 LIKE
运算符没有任何意义。
CASE
是一个 表达式 - 它旨在计算一个标量值。它不是某种形式的控制流语句。
SELECT C.NAME1, TO_CHAR(A.FROM_DT,'YYYY-MM-DD'), B.LINE_SEQ_NUM, B.IDENTIFIER, B.DESCR, B.GROSS_EXTENDED_AMT, A.INVOICE_AMOUNT,C. SETID,C.CUST_ID 来自 PS_BI_HDR A、PS_BI_LINE B、PS_CUSTOMER C 其中(A.BUSINESS_UNIT = B.BUSINESS_UNIT AND A.INVOICE = B.INVOICE AND A.BILL_TO_CUST_ID = C.CUST_ID AND A.BUSINESS_UNIT = :1 AND A.BILL_STATUS = :2 AND ( A.BILL_TYPE_ID = (CASE WHEN A.BILL_TYPE_ID = ' ' THEN A.BILL_TYPE_ID LIKE ' %' ELSE A.BILL_TYPE_ID = :3 END )) ) ORDER BY 1, 3
如果Like不能用于包含账单类型id的所有值,我应该在Case Statement中写什么
请不要在 cmets 中发布代码 - 您可能已经注意到,它实际上是不可读的。您的问题底部有一个编辑链接(但看起来 StevieG 已经很友好地在这次编辑它)
【参考方案1】:
在输入列表为空的情况下,您可以将A.BILL_TYPE_ID
与自身进行比较:
SELECT
C.NAME1,
TO_CHAR(A.FROM_DT,'YYYY-MM-DD'),
B.LINE_SEQ_NUM,
B.IDENTIFIER,
B.DESCR,
B.GROSS_EXTENDED_AMT,
A.INVOICE_AMOUNT,
C.SETID,
C.CUST_ID
FROM PS_BI_HDR A, PS_BI_LINE B, PS_CUSTOMER C
WHERE
(
A.BUSINESS_UNIT = B.BUSINESS_UNIT
AND A.INVOICE = B.INVOICE
AND A.BILL_TO_CUST_ID = C.CUST_ID
AND A.BUSINESS_UNIT = :1
AND A.BILL_STATUS = :2
AND
(
A.BILL_TYPE_ID =
(
CASE
WHEN :3 = ' ' THEN A.BILL_TYPE_ID
ELSE :3
END
)
)
) ORDER BY 1, 3
【讨论】:
【参考方案2】:在 where 子句中你可以这样使用 case:
WHERE
A.BILL_TYPE_ID = (CASE WHEN A.BILL_TYPE_ID = ' ' THEN ' %' ELSE ' 3' END)
【讨论】:
以上是关于案例语句在 PSQUERY Where 子句中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Crystal Reports v13.0.2000.0.:为啥“where”子句在子报表中不起作用?
带有日期字符串的 Android SQLite rawquery 在 WHERE 子句中不起作用