如果列不为空,mysql 连接列

问题描述 投票:0回答:5

这是表架构;

create table campaign (
    id INT NOT NULL,
    custom_param1 VARCHAR(15),
    custom_value1 VARCHAR(15),
    custom_param2 VARCHAR(15),
    custom_value2 VARCHAR(15),
    custom_param3 VARCHAR(15),
    custom_value3 VARCHAR(15),
    PRIMARY KEY (id)
)

这是我拥有的模拟数据;

id  custom_param1   custom_value1   custom_param2   custom_value2   custom_param3   custom_value3
--  -------------   -------------   -------------   -------------   -------------   -------------
1   param1          value1          param2          value2          param3          value3
2   param1          value1          param2          value2          param3          value3
3   param1          value1          param2          value2          param3          value3
4   param1          value1          param2          value2          NULL            NULL
5   param1          value1          NULL            NULL            NULL            NULL

现在我尝试像格式一样连接参数和值列

param1=value1; param2=value2, param3=value3

如果一行只有两个参数和值,它应该是这样的;

param1=value1; param2=value2

我创建了一个可以连接行的查询,但如果其中一个为空,则整行将变为空 - 据我所知,如果

concat
函数尝试连接 NULL 值字符串将完全变为空。这是我使用的查询。

select CONCAT(c.custom_param1, '=', c.custom_value1, '; ',
                c.custom_param2, '=', c.custom_value2, '; ',
                c.custom_param3, '=', c.custom_value3) as 'Custom Parameters'
from campaign as c;

我将不胜感激任何形式的帮助。还是谢谢啦

mysql sql concatenation
5个回答
7
投票

如果值为null的话,取决于你想做什么,你可以尝试一下

SELECT CONCAT(
c.custom_param1, '=', IFNULL(c.custom_value1, ''), '; ',
c.custom_param2, '=', IFNULL(c.custom_value2, ''), '; ',
c.custom_param3, '=', IFNULL(c.custom_value3, ''), '; ') as 'Custom Parameters'
FROM campaign as c;

会回来

param1=value1; param2=value2; param3=;

或者你可以像这样排除整个值对....

SELECT CONCAT(
IFNULL(CONCAT(c.custom_param1, '=', c.custom_value1, '; '), ''),
IFNULL(CONCAT(c.custom_param2, '=', c.custom_value2, '; '), ''),
IFNULL(CONCAT(c.custom_param3, '=', c.custom_value3, '; '), '')) AS 'Custom Parameters'
FROM campaign as c;

将会返回

param1=value1; param2=value2;

希望有帮助


1
投票

尝试下面的SQL

select CONCAT(IFNULL(c.custom_param1,''), '=', (IFNULL(c.custom_value1,''), '; ',
                (IFNULL(c.custom_param2,''), '=', (IFNULL(c.custom_value2,''), '; ',
                (IFNULL(c.custom_param3,''), '=', (IFNULL(c.custom_value3,'')) as 'Custom Parameters'
from campaign as c;

1
投票

使用 ifnull 检查列是否为空并将其替换为空白:

select CONCAT(ifnull(c.custom_param1,""), '=', ifnull(c.custom_value1,""), '; ',
                ifnull(c.custom_param2,""), '=', ifnull(c.custom_value2,""), '; ',
                ifnull(c.custom_param3,""), '=', ifnull(c.custom_value3,"")) as 'Custom Parameters'
from campaign as c;

更新:

select CONCAT(ifnull(c.custom_value1,concat(c.custom_param1,"=",c.custom_value1), ifnull(c.custom_value2,concat(";",c.custom_param2,"=",c.custom_value2)...) as 'Custom Parameters'
    from campaign as c;

1
投票

使用 ifnull http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull

select CONCAT(IFNULL(c.custom_param1, ''), '=', IFNULL(c.custom_value1, ''), '; ', IFNULL(c.custom_param2, ''), '=', IFNULL(c.custom_value2, ''), '; ', IFNULL(c.custom_param3, ''), '=', IFNULL(c.custom_value3,'')) as 'Custom Parameters' from campaign as c

您可以将

IFNULL(c.custom_param1, '')
更改为
IFNULL(c.custom_param1, 'NULL')
或任何您需要的内容。

更新信息

param1=value1; =; = which should be param1=value1
编辑:

select
CONCAT(
    IF(c.custom_param1 IS NOT NULL AND c.custom_value1 IS NOT NULL, CONCAT(c.custom_param1, '=', c.custom_value1, '; '), ''),
    IF(c.custom_param2 IS NOT NULL AND c.custom_value2 IS NOT NULL, CONCAT(c.custom_param2, '=', c.custom_value2, '; '), ''),
    IF(c.custom_param3 IS NOT NULL AND c.custom_value3 IS NOT NULL, CONCAT(c.custom_param3, '=', c.custom_value3), '')
) as 'Custom Parameters'
from campaign as c

示例:http://sqlfiddle.com/#!2/ef859f/2/0


1
投票
SELECT id,CONCAT_WS( 
           COALESCE(CONCAT(custom_param1, custom_value1), ''),
           COALESCE(CONCAT(custom_param2,  custom_value2), ''),
           COALESCE(CONCAT(custom_param3, custom_value3), '')) campaign_survey
       FROM campaign;
© www.soinside.com 2019 - 2024. All rights reserved.