亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在where子句中使用“ case expression column”

在where子句中使用“ case expression column”

有只小跳蛙 2019-12-03 16:20:04
SELECT ename  ,    job  ,    CASE deptno         WHEN 10           THEN 'ACCOUNTS'         WHEN 20           THEN 'SALES'         ELSE 'UNKNOWN'       END AS departmentFROM emp /* !!! */ WHERE department = 'SALES'這將失?。篛RA-00904:“%s:無效的標識符”有沒有一種方法可以克服Oracle 10.2 SQL中的此限制?如何在where子句中使用“ case expression column”?
查看完整描述

3 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

發生此錯誤的原因是,按照以下順序對SQL SELECT語句進行了邏輯 *處理:


FROM:選擇一個表或多個已聯接的表以及符合ON條件的所有行組合。


WHERE:評估條件,并刪除不匹配的行。


GROUP BY:將行分組(每組合為一行)


HAVING:評估條件,并刪除不匹配的行。


SELECT:評估列列表。


DISTINCT:刪除重復的行(如果它是SELECT DISTINCT語句)


UNION,EXCEPT,INTERSECT:那個操作的動作是在子SELECT語句的行拍攝。例如,如果它是UNION,則在評估所有子SELECT語句之后,將收集所有行(除非是UNION ALL,否則將刪除所有重復行)。因此,對于EXCEPT或INTERSECT情況。


ORDER BY:行是有序的。


因此,您不能使用in WHERE子句(尚未填充或計算的東西)。另請參見以下問題:oracle-sql-clause-evaluation-order


* 邏輯處理: 請注意,數據庫引擎還可以為查詢選擇其他評估順序(這就是它們通常要做的?。?。唯一的限制是結果應與使用上述順序相同。


解決方案是將查詢括在另一個查詢中:


SELECT *

FROM

  ( SELECT ename

         , job

         , CASE deptno

             WHEN 10 THEN 'ACCOUNTS'

             WHEN 20 THEN 'SALES'

                     ELSE 'UNKNOWN'

           END AS department

    FROM emp

  ) tmp

WHERE department = 'SALES' ;

或在WHERE條件下重復計算:


SELECT ename

     , job

     , CASE deptno

         WHEN 10 THEN 'ACCOUNTS'

         WHEN 20 THEN 'SALES'

                 ELSE 'UNKNOWN'

       END AS department

FROM emp

WHERE

    CASE deptno

      WHEN 10 THEN 'ACCOUNTS'

      WHEN 20 THEN 'SALES'

              ELSE 'UNKNOWN'

    END = 'SALES' ;

我想這是查詢的簡化版本,或者您可以使用:


SELECT ename

     , job

     , 'SALES' AS department

FROM emp

WHERE deptno = 20 ;


查看完整回答
反對 回復 2019-12-03
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

您的表不包含“部門”列,因此您不能在where子句中引用它。請改用deptno。


SELECT ename

,      job

,      CASE deptno

          WHEN 10

          THEN 'ACCOUNTS'

          WHEN 20

          THEN 'SALES'

          ELSE 'UNKNOWN'

       END AS department

FROM   emp /* !!! */ where deptno = 20;


查看完整回答
反對 回復 2019-12-03
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

select emp_.*

from (SELECT ename

  ,    job

  ,    CASE deptno

         WHEN 10

           THEN 'ACCOUNTS'

         WHEN 20

           THEN 'SALES'

         ELSE 'UNKNOWN'

       END AS department

FROM emp /* !!! */ ) emp_ where emp_.department='UNKNOWN';


查看完整回答
反對 回復 2019-12-03
  • 3 回答
  • 0 關注
  • 690 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號