2013-01-14 54 views
1

所以,我有下面的代碼將空值設置爲0,然後在運算符中使用0?

SELECT PICK_SO_NUMBER, CUSTOMER, SO_PRODUCT, DO_QUANTITY, DO_PACKING, DO_DATE, 
COALESCE(INVOICED_QTY, 0) AS INVOICED_QTY, 
DO_QUANTITY-INVOICED_QTY AS NOT_INVOICED, 
INVOICE_PACKING 
FROM VW_TRAFFIC_PO_SIDE 
WHERE DO_QUANTITY > INVOICED_QTY OR (INVOICED_QTY IS NULL AND DO_QUANTITY IS NOT NULL) 

聚結下面的線,是假設從INVOICED_QTY減去DO_QUANTITY,然而,當INVOICED_QTY是NULL,它不再由0中減去,它減去由零,因此新列返回INVOICED_QTY爲NULL的空值

我嘗試了多種事情:嘗試合併到一個案例中,將coalesce寫爲INVOICED,然後在減法表達式中使用INVOICED,我嘗試在與減法相同的行中使用合併(中間沒有逗號,我覺得這是最好的解決方案,但無法編譯)

+0

在什麼情況下是'INVOICED_QTY' null?爲什麼? –

+0

@LightnessRacesinOrbit *只是一個猜測*,OP在該字段中插入一個沒有值並且沒有默認值的記錄。 –

+0

,因爲查詢顯示(系統的)用戶未輸入發票時,卻收到發貨......此查詢旨在顯示人們何時忘記開具發票或每發貨時發票金額錯誤。 ..當某人沒有輸入發票時,該字段留空,因此,空分配 – socool111

回答

3

,當你在選擇列表和WHERE子句中使用相同的別名「invoiced_qty」它變得混亂。減法中的值是原始列值,而不是上一個選擇列表項中的合併值。在WHERE子句中也是如此。

SELECT PICK_SO_NUMBER, CUSTOMER, SO_PRODUCT, DO_QUANTITY, DO_PACKING, DO_DATE, 
     COALESCE(INVOICED_QTY, 0) AS INVOICED_QTY, 
     DO_QUANTITY - COALESCE(INVOICED_QTY, 0) AS NOT_INVOICED, 
     INVOICE_PACKING 
    FROM VW_TRAFFIC_PO_SIDE 
WHERE DO_QUANTITY > INVOICED_QTY 
    OR (INVOICED_QTY IS NULL AND DO_QUANTITY IS NOT NULL) 
+0

好點,這是我的錯誤,where子句是在我需要添加NOT_INVOICED之前幾天寫出來的,我沒有想到回去查看它。 – socool111

3

你不能在WHERE子句中使用ALIAS

SELECT PICK_SO_NUMBER, 
     CUSTOMER, 
     SO_PRODUCT, 
     DO_QUANTITY, 
     DO_PACKING, 
     DO_DATE, 
     COALESCE(INVOICED_QTY, 0) AS INVOICED_QTY, 
     DO_QUANTITY-INVOICED_QTY AS NOT_INVOICED, 
     INVOICE_PACKING 
FROM VW_TRAFFIC_PO_SIDE 
-- note that INVOICE_QTY in WHERE DO_QUANTITY > INVOICED_QTY 
-- does not compare the result of COALESCE(INVOICED_QTY, 0) 
-- but to the original value of INVOICE_QTY 
WHERE DO_QUANTITY > COALESCE(INVOICED_QTY, 0) OR 
     (INVOICED_QTY IS NULL AND DO_QUANTITY IS NOT NULL) 

的原因如下:

  • FROM子句
  • WHERE子句
  • GROUP BY子句
  • HAVING子句
  • SELE CT子句
  • ORDER BY子句

WHERE子句而來的SELECT其中ALIAS的設定發生)子句後。

但如果你真的想使用的別名,在子查詢包裹它,如

SELECT * 
FROM 
(
    SELECT PICK_SO_NUMBER, 
      CUSTOMER, 
      SO_PRODUCT, 
      DO_QUANTITY, 
      DO_PACKING, 
      DO_DATE, 
      COALESCE(INVOICED_QTY, 0) AS INVOICED_QTY, 
      DO_QUANTITY-INVOICED_QTY AS NOT_INVOICED, 
      INVOICE_PACKING 
    FROM VW_TRAFFIC_PO_SIDE 
) s 
WHERE DO_QUANTITY > INVOICED_QTY OR 
     (INVOICED_QTY IS NULL AND DO_QUANTITY IS NOT NULL) 
+0

我不完全理解你在WHERE中無效的別名的基本原理。 –

+0

@LightnessRacesinOrbit在這種情況下'INVOICED_QTY'是有效的,因爲它(*列*)確實存在。但我們假設'COALESCE(INVOICED_QTY,0)AS INVOICED_QTY_NEW',不能使用別名INVOICED_QTY_NEW。 –

+0

我知道這是無效的;我說我不理解你的_rationale_,爲什麼會出現這種情況,即在'SELECT'與它有關係後,'WHERE'是以詞法形式出現的呢? –