• MySQL 拼接字符串的3种方式


    方式一:CONTACT()

    功能:将多个字符串连接成一个字符串;

    语法:concat(str1, str2,...);

    说明:返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

      示例1:

    select CONCAT(DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日'),'到',DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')) 住院时间 FROM cz_fet_main_zy t
    WHERE T.VISITDATE is not null and T.FOUTHOSPDATE is not null;  

      示例2:

    select CONCAT(DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日'),'到',DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')) 住院时间 FROM cz_fet_main_zy t
    WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null;
    

      如果我们不想让它的值显示为null的话,可以使用IFNULL()函数;

    select IFNULL(CONCAT(DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ),'到',DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')), '') 住院时间 FROM cz_fet_main_zy t
    WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null;
    

      这说明:

      在同一行数据中,字段VISITDATE和字段FOUTHOSPDATE二者的值至少其中一个的值为null。

    方式二:CONTACT_WS()

    功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符(concat_ws就是concat with separator的缩写)

    语法:concat_ws(separator,str1,str2,...)

    说明:

    第一个参数指定分隔符;

    需要注意的是分隔符不能为null,如果为null,则返回结果为null。

    select CONCAT_WS('到',DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ),DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')) 住院时间 FROM cz_fet_main_zy t
    WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null;
    

      和上面的查询语句,除了使用的函数不一样外,没有任何区别,但为什么拼接结果不一样呢? 

      这是说明:

      在同一行数据中,字段VISITDATE和字段FOUTHOSPDATE二者的值有且只有其中一个的值为null。

      下面我们来证明一下:

      小结:

      contact()的适用情况:

      在确定两个字段都有值且不需要拼接符的情况;

      当其中一个字段的值为null且要求拼接结果为null时;

      contact_ws()的适用情况:

      其中一个字段的值为null,另一个字段的值不为null且要求拼接结果必须有值时;

      需要拼接符,且不允许当参数存在null,拼接结果不能为null时;

      以我上面使用的例子进行说明:

      住院时间,是一个时间段;

      当两个字段都有值时,才允许页面进行展示;

      当只有其中一个字段有值时,不允许页页面展示;

      这样一来,只有contact()能满足我的需求。

    方式三:GROUP_CONCAT()

    功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果

    语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc  ] [separator '分隔符'] )

    说明:

    通过使用distinct可以排除重复值;

    如果希望对结果中的值进行排序,可以使用order by子句;

    separator是一个字符串值,缺省为一个逗号。

      示例1:

    select DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ) 入院时间, GROUP_CONCAT(ID) 主键统计 FROM cz_fet_main_zy t
    WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null GROUP BY T.VISITDATE;
    

      实现的效果是:

      按照入院时间进行分组,并对该组中所有的ID进行统计穷举,ID之间使用逗号隔开;

      示例2:

      将上面的id号从大到小排序,且用'_'作为分隔符。

    select DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ) 入院时间, GROUP_CONCAT(ID order by id desc separator '_') 主键统计 FROM cz_fet_main_zy t
    WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null GROUP BY T.VISITDATE
    

      示例3:

      查询以入院时间分组的所有组的主键和患者类型

    select DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日' ) 入院时间, GROUP_CONCAT(CONCAT_WS(':',ID,PATIENTTYPE)) 主键HE患者类型 FROM cz_fet_main_zy t
    WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null GROUP BY T.VISITDATE;

     

    补充说明:

      IFNULL(expr1,expr2)

      参数expr1和expr2可以是具体值,也可以是函数;

      不管是expr1还是expr2最终返回必须是一个具体的值。

      说明:如果 expr1 不是 NULL,IFNULL() 返回 expr1代表的值,否则它返回 expr2代表的值。

      可以这样理解:

      参数1的值如果为空,则返回参数2;否则返回参数1本身。

      示例1:

    SELECT IFNULL(PREPAYAMOUNT,0) PREPAYAMOUNT from cz_fet_main_mz t limit 1;
    

      如果字段prepayment的值为null,则用0代替。

      示例2:

    select IFNULL(CONCAT(DATE_FORMAT(T.VISITDATE, '%Y年%m月%d日'),'到',DATE_FORMAT(T.FOUTHOSPDATE, '%Y年%m月%d日')), '') 住院时间 FROM cz_fet_main_zy t
    WHERE T.VISITDATE is null or T.FOUTHOSPDATE is null;
    

      如果函数的结果为null,则用空字符''替代。

      示例3:

    select IFNULL(IF(T.PATIENTTYPE = 0,'自费', (SELECT NAME FROM CZ_DIC_INFO WHERE CODE = T.MEDICALINSURANCETYPE)), '') 医保类型 FROM cz_fet_main_zy t limit 1
    

      如果表达式的结果为null,则用空字符''替代。

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    (最短路)2017 计蒜之道 复赛 D. 百度地图导航
    13 树的应用-并查集
    12 二叉树-链式存储-二叉排序树(BST)
    11 二叉树-链式存储-先序遍历、中序遍历、后序遍历和层序遍历的非递归算法实现
    10 二叉树-链式存储-递归遍历
    9 线性表-队列-链式存储
    8 线性表-循环队列-顺序存储
    操作系统-页式虚拟存储器管理系统设计
    杂谈:Windows操作系统的介绍与对Win8操作系统市场反响冷淡原因的分析
    一学期积累下来的SQL语句写法的学习
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/14991267.html
Copyright © 2020-2023  润新知