Sql 将null设置为0,然后在运算符中使用0?

Sql 将null设置为0,然后在运算符中使用0?,sql,Sql,所以我有下面的代码 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_

所以我有下面的代码

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)
合并下方的行假定从发票数量中减去DO数量,但是当发票数量为空时,它不再减去0,而是减去空,因此新列在发票数量为空时返回空值


我尝试了多种方法:尝试合并到一个案例中,将合并编写为发票,然后在减法表达式中使用发票,我尝试在减法的同一行中使用合并(中间没有逗号,我觉得这是最有效的解决方案,但无法编译)您不能在
WHERE
子句中使用
别名

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子句
  • 分组依据子句
  • 有从句
  • SELECT子句
  • 按条款订货
WHERE
子句位于
SELECT
(别名设置发生在该子句之后)子句之后

但是如果您真的想使用这个别名,可以将它包装在子查询中,例如

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)

不能在
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子句
  • 分组依据子句
  • 有从句
  • SELECT子句
  • 按条款订货
WHERE
子句位于
SELECT
(别名设置发生在该子句之后)子句之后

但是如果您真的想使用这个别名,可以将它包装在子查询中,例如

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)

当您在select列表和WHERE子句中使用相同的别名“Invocated_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)

当您在select列表和WHERE子句中使用相同的别名“Invocated_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)

在什么情况下,
发票数量
为空?为什么会这样?@LightnessRacesinOrbit这只是一个猜测,OP会插入一条记录,该记录在该字段中没有值,也没有默认值。因为查询显示的是用户(系统)没有输入发票,但他们收到了发货……此查询旨在显示人们忘记开具发票的时间,或者每次交付的发票金额错误…如果有人没有输入发票,则该字段留空,因此,将显示空值assigned@socool111:好的,这是有道理的在什么情况下,
发票数量
为空?为什么会这样?@LightnessRacesinOrbit这只是一个猜测,OP会插入一条记录,该记录在该字段中没有值,也没有默认值。因为查询显示的是用户(系统)没有输入发票,但他们收到了发货……此查询旨在显示人们忘记开具发票的时间,或者每次交付的发票金额错误…如果有人没有输入发票,则该字段留空,因此,将显示空值assigned@socool111:好的,这是有道理的我不太理解您在
中的别名无效的理由,其中
@LightnessRacesinOrbit在这种情况下
发票数量
是有效的,因为它(列)确实存在。但是假设
合并(发票数量,0)为发票数量新
,则不能使用别名
发票数量新
。我知道它无效;我说我不明白你为什么会这样,也就是说,
选择之后的
在哪里
跟它有什么关系?我不太明白你为什么在
中的别名无效,因为它(列)是有效的确实存在。但是假设
合并(发票数量,0)为发票数量新
,则不能使用别名
发票数量新
。我知道它无效;我说我不明白你为什么会这样,也就是说,
WHERE
SELECT
之后出现与此有什么关系?啊,好的一点,这是我的错误,WHERE子句是在我需要添加未开具发票的前几天写的,我不想回去查看它。啊,好的一点,这是我的错误,where条款是在我需要添加NOT_发票的前几天编写的,我不想再回去查看它。