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

如何将MySQL中的字符串作为PHP连接函数进行连接?,php,mysql,perl,join,Php,Mysql,Perl,Join,我在MySQL中有这样的数据结构: +-----------+-----------+--------------+ | name | barcode | factory_code | +-----------+-----------+--------------+ | product 1 | 123456789 | | | product 2 | 987654321 | | | product 3 | | A

我在MySQL中有这样的数据结构:

+-----------+-----------+--------------+
| name      | barcode   | factory_code |
+-----------+-----------+--------------+
| product 1 | 123456789 |              |
| product 2 | 987654321 |              |
| product 3 |           | AAAAAAAAAAAA |
| product 4 |           | BBBBBBBBBBBB |
| product 5 | 111111111 | CCCCCCCCCCCC |
+-----------+-----------+--------------+
现在我需要生成这个结果并用HTML显示:

+-----------+-------------------------+
| name      | code                    |
+-----------+-------------------------+
| product 1 | 123456789               |
| product 2 | 987654321               |
| product 3 | AAAAAAAAAAAA            |
| product 4 | BBBBBBBBBBBB            |
| product 5 | 111111111, CCCCCCCCCCCC |
+-----------+-------------------------+
字段不是空的,只是空的

我想我直接用一个MySQL查询来生成它,这样代码就更少了,也许工作速度会快一点。我可以用PHP/Perl的
join
函数来实现

可以直接在MySQL中执行吗?

您可以使用。由于没有
NULL
而是空字符串,因此需要实现一些逻辑来过滤掉这些空字段

SELECT 
    name, 
    concat_ws(
        ', ', 
        IF(barcode > "", barcode, NULL),
        IF(factory_code > "", factory_code, NULL)
    ) as 'code' 
FROM Table1;
同样,如果
barcode
包含空格或控制字符,则它将不等于空字符串,因此
barcode=“”
将失败,结果将是一个伪逗号。但是MySQL空间扩展了比较的两个参数,因此任何包含非空格字符的内容都将“大于”任何不包含空格字符的内容<代码>如果(条形码>“”,条形码,NULL)变为
NULL
任何仅为控制字符(HT、LF、CR等)或空格的内容

试试看

然而,它不会给你更多的速度让DB去做。对于这个相当小的数据量,它是可以忽略不计的,我认为它甚至不值得考虑

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

while (my $res = $sth->fetchrow_arrayref) {
    my $name = shift @$res;
    my $code = join ', ', grep { $_ } @$res;
    # and then do stuff
}
grep{$\u}@$res
过滤掉所有不被认为是真值的值。也就是说,空字符串以及由
undef
表示的
NULL


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


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

您可以尝试类似的方法:

SET @a := 'abc';
SET @b :='def';

SELECT CONCAT(@a, IF(LENGTH(@a) >0 AND LENGTH(@b) >0,',',''), @b)
@a
替换为
条码
,将
@b
替换为
工厂代码

在您的情况下:

SELECT
    name,
    CONCAT(
            barcode,
            IF(LENGTH(barcode) > 0  AND LENGTH(factory_code) > 0, ',', ''),
            factory_code
    ) AS 'code'
FROM t;
当@a和@b为非空时

当@a为空且@b为非空时

当@a非空且@b为空时


当@a和@b为空时

我根据的答案找到了一个简单的解决方案

SELECT CONCAT_WS(', ',
          IF( LENGTH(barcode) > 0, barcode, NULL),
          IF( LENGTH(factory_code) > 0, factory_code, NULL) AS code
       FROM tablename;

所以
mysql string concat
什么也不显示?缺少的值是null/空的?它们是空的。不为空。
concat_ws
显示此''BBBBBBBBBBBB'。。。但是字段不是
NULL
只是空的。“从维护的角度来看(如果这很重要的话),最好在应用程序中执行,而不是在SQL中执行。”完全同意。@Walf为什么?请解释。@simbabque:如果
条码
包含空格或控制字符,则它将不等于空字符串,因此
条码=”“
将失败,结果将是一个伪逗号。但是MySQL空间扩展了比较的两个参数,因此任何包含非空格字符的内容都将“大于”任何不包含空格字符的内容<代码>如果(条形码>“”,条形码,空)将任何仅为控制字符(HT、LF、CR等)或空格的内容变为空。@Borodin谢谢。这是有道理的。我把它添加到了答案中。它可能与谁有关:请说明否决投票背后的原因,以便我能够完善我的知识。静默向下投票不会添加任何内容
(+)ve
SELECT CONCAT_WS(', ',
          IF( LENGTH(barcode) > 0, barcode, NULL),
          IF( LENGTH(factory_code) > 0, factory_code, NULL) AS code
       FROM tablename;