Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用分隔符指定不同的值_Mysql_Sql - Fatal编程技术网

Mysql 使用分隔符指定不同的值

Mysql 使用分隔符指定不同的值,mysql,sql,Mysql,Sql,我的表中有几个字段,我想使用-作为分隔符,将其中一些字段组合成一个字符串: select concat( case when a <> 'a' then concat('A = ', a) case when b <> 'b' then concat(' - B = ', b) ... case when z <> 'z' then concat(' - Z = ', z) )

我的表中有几个字段,我想使用
-
作为分隔符,将其中一些字段组合成一个字符串:

select 
    concat(
        case when a <> 'a' then concat('A = ', a)
        case when b <> 'b' then concat(' - B = ', b)
        ...
        case when z <> 'z' then concat(' - Z = ', z)
    )
;
选择
海螺(
当a'a'然后concat('a=',a)时的情况
当b'b'然后concat('-b=',b)时的情况
...
当z'z'然后concat('-z=',z)时的情况
)
;
现在,如果不包括A,那么我的结果将以
-
开头,我不希望这样。实际上,我有15个案例,所以我不能再检查A是否为1来插入
-
。最简单的解决方案是什么,这样我的字符串就不会以分隔符开头


我知道我可以检查它是否以“-”开头,但这对我来说是一个肮脏的解决方案…

如果我很理解您的问题,您应该尝试使用
concat_ws
类似以下代码的内容(通常
concat_ws
会跳过您案例语句中的空值):

下面的例子

create table table5
(   id int auto_increment primary key,
    a int not null,
    b int not null
);
insert table5(a,b) values (0,0),(1,0),(1,1),(0,1),(1,1);

SELECT 
    id, 
    CONCAT_WS( 
        ' - ',  
        (CASE a WHEN 1 THEN CONCAT('A = ', a) ELSE null END),  
        (CASE b WHEN 1 THEN CONCAT('B = ', b) ELSE null END) 
    ) as xxx 
    from table5; 
+----+---------------+
| id | xxx           |
+----+---------------+
|  1 |               |
|  2 | A = 1         |
|  3 | A = 1 - B = 1 |
|  4 | B = 1         |
|  5 | A = 1 - B = 1 |
+----+---------------+

如果我很理解您的问题,您应该尝试使用
concat_ws
进行类似以下代码的操作(通常
concat_ws
将跳过案例语句中的空值):

下面的例子

create table table5
(   id int auto_increment primary key,
    a int not null,
    b int not null
);
insert table5(a,b) values (0,0),(1,0),(1,1),(0,1),(1,1);

SELECT 
    id, 
    CONCAT_WS( 
        ' - ',  
        (CASE a WHEN 1 THEN CONCAT('A = ', a) ELSE null END),  
        (CASE b WHEN 1 THEN CONCAT('B = ', b) ELSE null END) 
    ) as xxx 
    from table5; 
+----+---------------+
| id | xxx           |
+----+---------------+
|  1 |               |
|  2 | A = 1         |
|  3 | A = 1 - B = 1 |
|  4 | B = 1         |
|  5 | A = 1 - B = 1 |
+----+---------------+

您能给我们展示一个示例表以及您想要的输出吗?假设我有一个包含26个字段(a-->Z)的表。所有这些都是简单的VARCHAR(10)可能的输出:C=r-F=z-Y=q-z=n我意识到我的示例选择得不好,但这不重要……是的,但是数据是什么,你想要什么输出?我们无法读懂您的想法。我编辑了我的示例以使其更清晰。如果“-”的字符索引为1,为什么不按照您已经可以的方式获取字符串,然后将子字符串从2变为长度-1呢。如果使用sub select或cte,引用列别名将很容易,而不是复制/粘贴长case语句。能否向我们展示一个示例表以及所需的输出?假设我有一个包含26个字段(a-->Z)的表。所有这些都是简单的VARCHAR(10)可能的输出:C=r-F=z-Y=q-z=n我意识到我的示例选择得不好,但这不重要……是的,但是数据是什么,你想要什么输出?我们无法读懂您的想法。我编辑了我的示例以使其更清晰。如果“-”的字符索引为1,为什么不按照您已经可以的方式获取字符串,然后将子字符串从2变为长度-1呢。如果使用sub-select或cte,引用列别名将很容易,而不是复制/粘贴长case语句。这正是我要寻找的。谢谢很好的答案,例如米卡·埃尔特克斯:)这正是我想要的。谢谢很好地回答了MickaëlThx的例子:)