代码之家  ›  专栏  ›  技术社区  ›  Sami

Concat中的Group_Concat不使用NULL值

  •  8
  • Sami  · 技术社区  · 12 年前

    我有一张桌子

    CREATE TABLE IF NOT EXISTS `dept` (
      `did` int(11) NOT NULL,
      `dname` varchar(50) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    INSERT INTO `dept` (`did`, `dname`) VALUES
    (1, 'Hi'),
    (2, NULL),
    (3, 'Hello');
    

    然后我有个问题

    select group_concat(concat(did,"','",dname) separator '),(') as Result from dept
    

    它正在产生结果 1','Hi'),('3','Hello

    问题: 我如何从上面的查询中获得结果 1','Hi'),('2','NULL'),('3','Hello

    它缺少具有NULL值的行,但我需要获取所有行

    Link for SQL Fiddle Demo of question

    更新: 如果我有多个或多个允许NULL的列,是否有某种方法可以一劳永逸地应用COALESCE,或者必须在每个列上单独应用?

    3 回复  |  直到 10 年前
        1
  •  9
  •   Sami    12 年前

    试试这个,用 COALESCE

    .., COALESCE(dname, 'NULL'),..
    

    成功了 NULL 字符串可见。 SQLFIDDLE DEMO

        2
  •  2
  •   Michael Berkowski    12 年前

    来自 MySQL aggregate function documentation 以下为:

    除非另有说明,否则组函数将忽略NULL值。

    使用 COALESCE() 将null替换为字符串,因为聚合函数会消除这些null。例如 COALESCE(dbname, 'NULL') 将返回 一串 NULL 如果 dbname IS NULL .其目的是归还第一个 非空 的参数,因此可以返回默认值。

    SELECT
      GROUP_CONCAT(CONCAT(did,"','", COALESCE(dname, 'NULL')) SEPARATOR "'),('") AS Result
    FROM dept
    
        3
  •  0
  •   jsist    12 年前

    希望以下查询能达到您的目的

    SELECT GROUP_CONCAT(
    IF(dname IS NOT NULL, CONCAT(did,"','",dname), CONCAT(did,"','NULL")) 
    SEPARATOR '),(') AS Result FROM dept