如何将MySQL中的字符串作为PHP连接函数加入?

net*_*djw -1 php mysql perl join

我在MySQL中有这个数据结构:

+-----------+-----------+--------------+
| name      | barcode   | factory_code |
+-----------+-----------+--------------+
| product 1 | 123456789 |              |
| product 2 | 987654321 |              |
| product 3 |           | AAAAAAAAAAAA |
| product 4 |           | BBBBBBBBBBBB |
| product 5 | 111111111 | CCCCCCCCCCCC |
+-----------+-----------+--------------+
Run Code Online (Sandbox Code Playgroud)

现在我需要生成此结果并以HTML格式显示:

+-----------+-------------------------+
| name      | code                    |
+-----------+-------------------------+
| product 1 | 123456789               |
| product 2 | 987654321               |
| product 3 | AAAAAAAAAAAA            |
| product 4 | BBBBBBBBBBBB            |
| product 5 | 111111111, CCCCCCCCCCCC |
+-----------+-------------------------+
Run Code Online (Sandbox Code Playgroud)

字段不是NULL,只是空的.

我认为我直接用MySQL查询生成这个,编码更少,也许它会更快地工作.我可以使用PHP的/ Perl join函数来完成它.

有可能直接在MySQL中做吗?

sim*_*que 5

你可以concat_ws()在MySQL中使用.由于您没有NULL空字符串,因此您需要实现一些逻辑来过滤掉这些空字段.

SELECT 
    name, 
    concat_ws(
        ', ', 
        IF(barcode > "", barcode, NULL),
        IF(factory_code > "", factory_code, NULL)
    ) as 'code' 
FROM Table1;
Run Code Online (Sandbox Code Playgroud)

正如Borodin在他的评论中指出的那样,如果barcode包含空格或控制字符,则它将不等于空字符串,因此barcode = ""将失败,结果将是一个虚假的逗号.但MySQL空间扩展了比较的两个参数,因此任何包含非空格字符的内容都将"大于"任何不包含非空格字符的内容.IF (barcode > "", barcode, NULL)转向NULL任何只是控制字符(HT,LF,CR等)或空格的东西.

在这里试试吧.

但是,它不会让你更快地让数据库做到这一点.对于这个相当少量的数据,它可以忽略不计,我认为它甚至不值得考虑.

在Perl中,您还必须添加空字符串的检查.

while (my $res = $sth->fetchrow_arrayref) {
    my $name = shift @$res;
    my $code = join ', ', grep { $_ } @$res;
    # and then do stuff
}
Run Code Online (Sandbox Code Playgroud)

grep { $_ } @$res过滤掉不被认为是所有值的真正价值.也就是说,空字符串以及NULL值表示的值undef.

从维护的角度来看(如果这很重要),在应用程序而不是SQL中执行它是首选1.如果它是一次性代码,我个人会选择那个让我思考最少的代码.

1)也就是说,如果我们在谈论在一个小应用程序内混合的纯SQL.在更大的范围内,如果有实际的模型层,我会将聚合移动到该模型中.