【问题标题】:How to print zero for rows with no content?如何为没有内容的行打印零?
【发布时间】:2014-06-01 12:39:38
【问题描述】:

我有两个银行数据库表。一个是客户列表,另一个是帐户列表。当我离开外部加入客户帐户时,我有客户记录,但没有任何内容。我怎样才能为他们打印零?

    SQL> CREATE TABLE Customer (
      2          BSB#            CHAR(6)         NOT NULL, /* Bank BSB number    */
      3          Customer#       NUMBER(10)      NOT NULL, /* Customer number    */
      4          Name            VARCHAR2(30)    NOT NULL, /* Customer name      */
      5          DOB             Date,                     /* Date of birth      */
      6          Sex             CHAR,                     /* M-Male, F-Female   */
      7          Address         VARCHAR2(50)    NOT NULL, /* Customer address   */
      8          Phone#          VARCHAR2(15),             /* Phone number       */
      9          CONSTRAINT Project_PK PRIMARY KEY(BSB#, Customer#),
     10          CONSTRAINT Project_FK FOREIGN KEY (BSB#) REFERENCES Bank(BSB#)
     11  );

SQL> CREATE TABLE Account (
  2          BSB#            CHAR(6)         NOT NULL, /* Bank BSB number    */
  3          Customer#       NUMBER(10)      NOT NULL, /* Customer number    */
  4          Account#        NUMBER(10)      NOT NULL, /* Account number     */
  5          Type            VARCHAR2(20)    NOT NULL, /* Account type       */
  6          Balance         NUMBER(10,2)    NOT NULL, /* Account balance    */
  7          CONSTRAINT WorksOn_PK PRIMARY KEY(BSB#, Account#),
  8          CONSTRAINT WorksOn_FK1 FOREIGN KEY(BSB#, Customer#) REFERENCES Customer(BSB#, Customer#)
  9  );

命令:

select c.name, CUS.MYSUM
from customer c 
left outer join 
(
select customer#,sum(balance) MYSUM
from account 
group by customer# 
) CUS
on c.customer# = CUS.customer#;​

输出:

NAME                                MYSUM
------------------------------ ----------
Ben                            -470211.09
Mike                           -470211.09
Jean                            -60028.03
Douglas                           1970.35
Josef                             1970.35
Duke                             54469.12
Alex                           -323631.76
Harry
Will

我想在哈利和威尔前面打印 0?

【问题讨论】:

    标签: mysql sql sql-server oracle oracle11g


    【解决方案1】:

    将您的第一行查询更改为

    select c.name, COALESCE(CUS.MYSUM, 0)
    

    COALESCE 是一个标准的 sql 函数,它返回其参数中第一个表达式的值,该表达式的计算结果为 NULL。如果没有这样的表达式,它将返回NULL。

    搜索到的CASE 表达式提供了类似的功能:

    select c.name, CASE WHEN CUS.MYSUM IS NULL THEN '0' ELSE CUS.MYSUM END
    

    优点是:

    • 在非空情况下使用的实际值不必是被检查列的值
    • 您可以测试任意表达式

    为代价
    • 可读性较差
    • 性能影响(通常可以忽略不计,在复杂查询结果集投影 [即select-ing 列] 需要最少的处理时间)。

    参考:mysql 5.0 doc on COALESCE

    【讨论】:

      【解决方案2】:

      您可以为此使用IFNULL

      https://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull

      mysql> SELECT IFNULL(1,0);
          -> 1
      mysql> SELECT IFNULL(NULL,10);
          -> 10
      mysql> SELECT IFNULL(1/0,10);
          -> 10
      mysql> SELECT IFNULL(1/0,'yes');
          -> 'yes'
      

      在处理单个值时,IFNULL 应该优先于 COALESCE 以提高可读性

      【讨论】:

        【解决方案3】:
        select c.name, CUS.MYSUM
        from customer c 
        left outer join 
        (
        select  customer#,CASE WHEN LEN(balance) <> 0 THEN sum(balance) ELSE 0 END    MYSUM
        from account 
        group by customer# 
        ) CUS
        on c.customer# = CUS.customer#
        

        【讨论】:

          【解决方案4】:

          对于SQL-Server,可以使用ISNULL

          SELECT ISNULL(NULL,0);
              -> 0
          
          SELECT ISNULL(1,0);
              -> 1
          

          但合并似乎更好: http://sqlmag.com/t-sql/coalesce-vs-isnull

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-06-05
            • 1970-01-01
            • 1970-01-01
            • 2013-03-20
            • 1970-01-01
            • 2022-12-02
            • 1970-01-01
            相关资源
            最近更新 更多