案例语句在 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 子句中不起作用

在SQL中的WHERE和HAVING语句中使用别名?

BigQuery 的 WHERE 子句中的 SELECT 语句不起作用

Sql where子句不起作用

WHERE 语句在应该更新数据的 SQL 中不起作用[关闭]