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