CREATE TABLE IF NOT EXISTS persona
(
persona_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50) NOT NULL,
apellido_paterno VARCHAR(50),
apellido_materno VARCHAR(50) NOT NULL
);
-- Tratamiento de NULL con CONCAT_WS y varios separadores ... ¡genial ++!
SELECT CONCAT_WS(
'', apellido_paterno, ' ', apellido_materno, ', ' ,nombre
) datos
FROM persona;
结果将是:
datos
1 Pérez, Pedro
2 Ruiz García, Santiago
3 Arias, Juan
一、文件说什么
让我们先看看文档对这两个函数的解释:
CONCAT()
换句话说,任何
NULL
进入 a 的值都会CONCAT
使所有其他值无效。CONCAT_WS()
二、确定在实际场景中使用哪一个
假设一个表格布局是这样的:
(a)
CONCAT
价值观问题NULL
上面显示的表格布局是一种常见的布局,实际上任何表格都可以有类似的列
apellido_paterno
,也就是取值的列NULL
。不仅如此,在任何不为这些列分配值的插入中,其默认值为NULL
.这意味着,如果我们进行这样的插入:
该列
apellido_paterno
将默认接收 valueNULL
。如果我们
CONCAT
在表中使用persona
:结果,在的情况下
Pedro Pérez
将是:换句话说,既不是佩德罗,也不是佩雷斯,也不是任何东西……只是
NULL
。真的很可怕吧?请注意,这
NULL
和空字符串不是一回事。让我们尝试另一个INSERT
:由于您很细心,您已经看到该列
apellido_paterno
正在接收一个空字符串''
。而且我们会看到他
CONCAT()
是空弦的朋友......只是他CONCAT()
有他的喜好......这不公平,不!:)SELECT
上面的结果Juan Arias
将是:问题是,当没有明确给出值时,列会得到一个值
NULL
,如果我们使用CONCAT
.(b) 的行为
CONCAT_WS()
让我们看看他
CONCAT_WS()
对我们朋友的表现如何Pedro Pérez
:这将导致:
和
Juan Arias
?:这几乎
CONCAT_WS
是一个奇迹!根据它的语法,我们必须把分隔符放在开头,然后是我们想要连接的列或值的列表。如果垫片相同,那很好,但如果我需要不同的垫片怎么办?.
我们能做到!, 将一个空字符串作为分隔符并连接列和值,就像我们对 所做的那样
CONCAT()
,即手工制作:结果将是:
很好,但是......当一些数据丢失时会有一个空格!这有一个解决方案,由你来找到它。
三、结论
自
CONCAT()
:NULL
并看到
CONCAT_WS()
:NULL
CONCAT()
在分隔符更改的情况下使用我们可以得出结论,它可以
CONCAT_WS()
在所有情况下使用,如果我们想使用它,CONCAT()
我们必须完全确定所涉及的所有值都是noneNULL
。可以在此处找到答案中使用的代码的完整演示。