我正在創建 oracle 報告,如果用戶輸入 true 或 false,則相應的值應該轉到引數。如果用戶輸入 All,則 true 和 false 都應該轉到引數。
我以 3 種方式使用了以下 case 陳述句。所有這些都顯示缺少關鍵字錯誤。你能幫我解決這個問題嗎?
WHERE "EngExec Status" = ((:eng_exec_status = 'True' and "EngExec Status" = 'True')
OR (:eng_exec_status = 'False' AND "EngExec Status" = 'False')
OR (:eng_exec_status = 'All' AND ("EngExec Status" = 'True' OR "EngExec Status"= 'False')))
WHERE "EngExec Status" IN (CASE
WHEN (:eng_exec_status) = 'True' THEN "EngExec Status"= 'True'
WHEN (:eng_exec_status) = 'False' THEN "EngExec Status"= 'False'
ELSE "EngExec Status" IN ('True', 'False')
END)
WHERE "EngExec Status" IN (CASE
WHEN (:eng_exec_status) = 'All' THEN "EngExec Status" IN ('True','False')
ELSE (:eng_exec_status)
END)
uj5u.com熱心網友回復:
我的猜測是你想要一些簡單的東西
WHERE ( :eng_exec_status = 'All' )
OR ( :eng_exec_status = "EngExec Status" )
uj5u.com熱心網友回復:
你的第一個片段:
WHERE "EngExec Status" = ((:eng_exec_status = 'True' and "EngExec Status" = 'True')
OR (:eng_exec_status = 'False' AND "EngExec Status" = 'False')
OR (:eng_exec_status = 'All' AND ("EngExec Status" = 'True' OR "EngExec Status"= 'False')))
像您一樣失敗WHERE column_value = (<boolean_expression>),這不是有效的語法。您可以"EngExec Status" = 在開始時洗掉:
WHERE (:eng_exec_status = 'True' AND "EngExec Status" = 'True')
OR (:eng_exec_status = 'False' AND "EngExec Status" = 'False')
OR (:eng_exec_status = 'All' AND ("EngExec Status" = 'True' OR "EngExec Status"= 'False'))
第二個片段的CASE運算式為:
CASE
WHEN (:eng_exec_status) = 'True' THEN "EngExec Status"= 'True'
WHEN (:eng_exec_status) = 'False' THEN "EngExec Status"= 'False'
ELSE "EngExec Status" IN ('True', 'False')
END
它應該具有以下語法:
CASE WHEN comparison_expr THEN return_expr [...] ELSE expr END
而從檔案:
對于簡單
CASE運算式和搜索運算式,所有運算式都return_exprs必須具有相同的資料型別(CHAR、VARCHAR2、NCHAR、 或NVARCHAR2、NUMBER、BINARY_FLOAT、 或BINARY_DOUBLE),或者都必須具有數字資料型別。
您的回傳值沒有任何這些資料型別,您已將比較運算式放入其中。
Oracle 抱怨“缺少關鍵字錯誤”,因為它期望在and子句之后的WHEN,ELSE或END關鍵字(因為在該位置放置比較運算式是無效的,因此and運算子和它們后面的運算式是無效的語法) ."EngExec Status"THENELSE=IN
您的第三個代碼段由于與第二個類似的原因而失敗。
如果您CHECK對"EngExec Status"列有約束以將值限制為'True'或,'False'那么您可以將WHERE過濾器簡化為:
WHERE :eng_exec_status = "EngExec Status" OR :eng_exec_status = 'All'
如果您沒有CHECK限制值的約束,則可以使用:
WHERE "EngExec Status" IN ('True', 'False')
AND (:eng_exec_status = "EngExec Status" OR :eng_exec_status = 'All')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373101.html
