mysql case when 碰上中文字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql case when 碰上中文字符串相关的知识,希望对你有一定的参考价值。

碰上中文字符串

大家好
我有一个表如下
publications id | publications field id| publications description
1000 | 1 | 小名
1000 | 2 | 2014
1000 | 4 | aa@...
1000 | 6 | 123-456-789
1012 | 1 | 阿花

我想把它结合成这样
publications id | publications description
1000 |小名,2014,NULL,aa@..,NULL,123-456-789
1012 |阿花, NULL, NULL, NULL, NULL, NULL

目前是使用casewhen
SELECT publications id,
case publications field id when ‘1’ then publications description else 'null'end as column1,
case publications field id when ‘2’ then publications description else 'null'end as column2,
case publications field id when ‘3’ then publications description else 'null'end as column3,
case publications field id when ‘4’ then publications description else 'null'end as column4,
case publications field id when ‘5’ then publications description else 'null'end as column5,
case publications field id when ‘6’ then publications description else 'null'end as column6
FROM publications
Group by publications id

结果却产出
publications id | publications description
1000 | NULL, NULL, NULL, NULL, NULL, NULL
1012 |阿花, NULL, NULL, NULL, NULL, NULL

竟然只有出现一次阿花,其他都不见了??
到底是哪里写错呢?是因为中文吗?还是><?

参考技术A 恩。。。感觉不大对呢。
小名,2014,NULL,aa@..,NULL,123-456-789
是在一个字段里吧,按照你下面的写法,好像是放到了很多的字段里,你确定这个是你要的?
你用group_concat函数试试,应该能达到你上面的需求。(就是没有null)
至于你上面的问题,你的语句去掉group查出来的结果应该是
1000 小名 null null null null null
1000 null 2014 null null null null
。。。。。。。。。
你在group聚合的时候,没有指令上面的字段和下面的字段用什么方式结合,就是说“小名+null”用什么方式结合,也就是说在case when的外层少了一个聚合函数,不过按照这个写法,这个聚合函数是什么我还真不清楚,因为不管怎么聚和每个字段都会出现一堆的NULL,跟你的要求不符。
比较简单的解决办法,个人建议补齐1-6,没有就写null,这样查询的话用group_concat就行。
如果不加,个人感觉就比较麻烦了。
先用null合并,就是不加单引号的null,聚合后在显示的时候用上ifnull追问

是的我想存成一个字段里!

小名,2014,NULL,aa@..,NULL,123-456-789


而且如你所说

现在真是这样

1000   小名    null  null  null   null null

1000   null    2014 null  null   null null

刚也在尝试groupby 完全如你预期无法结合


追答

你把
case publications field id when ‘1’ then publications description else 'null'end as column1,
改为
case publications field id when ‘1’ then publications description else null end as column1,
其他几个都改,这样,应该就是
1000 小名 空 空 空 空 空
1000 空 2014 空 空 空 空
。。。。。
然后你用在外面套一层group_concat试试看看出来的结果是什么,我说的是每个字段的结果,
group_concat(case publications field id when ‘1’ then publications description else null end) as column1
你看看字段1-6出的结果是什么。
如果是1000 小名 2014 空 。。。。。那就好了
但如果是1000 小名,,, ,2014,,,, ,,,,,, 。。。。。那就麻烦了。
这时别忘了groupby啊

追问

谢谢你阿 真是对了!
改成null 另加group_concat就对啦!
不过现在就只好乖乖写70行了..

追答

那没办法啊,对了别忘了还要用到ifnull,不然null不显示null这个字符的。呵呵

追问

谢谢你这么仔细教学阿~~~:D 料事如神

本回答被提问者采纳

MySQL 中的 COUNT CASE 和 WHEN 语句

【中文标题】MySQL 中的 COUNT CASE 和 WHEN 语句【英文标题】:COUNT CASE and WHEN statement in MySQL 【发布时间】:2011-06-30 00:42:20 【问题描述】:

如何在 MySQL 查询中使用 COUNT CASE 和 WHEN 语句来统计一个 MySQL 查询中数据何时为 NULL 和何时不为 NULL?

【问题讨论】:

COUNT(col) = NOT NULL 的数量。 COUNT(*) - COUNT(col) = NULL 的数量为什么需要CASE 我可以在 COUNT 函数中使用 case..吗? 【参考方案1】:

用途:

SELECT SUM(CASE 
             WHEN t.your_column IS NULL THEN 1
             ELSE 0
           END) AS numNull,
       SUM(CASE 
             WHEN t.your_column IS NOT NULL THEN 1
             ELSE 0
           END) AS numNotNull
  FROM YOUR_TABLE t

这将总结整个表的 NULL & not NULL 列。根据需要,您可能需要一个 GROUP BY 子句。

【讨论】:

现在如何回显这个值,多少是NULL,多少不是NULL。 @Ivan Tanasijevic:mysql_query documentation中有例子 如果您想使用COUNT 实现这一目标,您可以使用 null(未计算在内)和另一个任意值(已计算在内)。 请注意,如果没有选择任何行(即表为空或 where 条件排除所有行),SUM 将返回 NULL。您仍然可以通过以这种方式对选择进行编码来获得“0”:IFNULL(SUM(...), 0)【参考方案2】:

您可以利用 COUNT 仅计算非空值的事实:

SELECT COUNT(IFNULL(t.your_column, 1)) AS numNull,
       COUNT(t.your_column) AS numNotNull
  FROM YOUR_TABLE t

另一种方法是利用逻辑条件被评估为数字 0 和 1 的事实,因此这也可以:

SELECT IFNULL(SUM(t.your_column IS NULL), 0) AS numNull,
       IFNULL(SUM(t.your_column IS NOT NULL), 0) AS numNotNull
  FROM YOUR_TABLE t

请注意,如果没有选择行(即表为空或 where 条件排除所有行),SUM 将返回 NULL,这就是 IFNULL 语句的原因。

【讨论】:

以上是关于mysql case when 碰上中文字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中正确使用 CASE..WHEN

在 MySQL 的选择查询中使用 CASE、WHEN、THEN、END

MYSQL case when 的两种用法

Mysql SELECT CASE WHEN 某事然后返回字段

MySQL CASE WHEN where 子句导致失败

mysql 查询某个字段并拼接case when出来的字段