在MySQL中使用COALESCE

时间:2014-03-13 20:10:57

标签: mysql sql

我只是习惯了MySQL,我来自SQL Server背景......

这个SQL查询构建了一个地址,它应该如何在SQL Server中,如何使其适应在MySQL中使用。当我在SQL Server中运行它时,它显示每个字段中的所有数据,当在MySQL中运行时,它只显示第一个字段。

为什么会这样,我应该在MySQL中做些什么?

SELECT COALESCE(House, '') + ' ' + COALESCE(StreetName, '') + ' ' + COALESCE(TownCity, '') + ' ' + COALESCE(Postcode, '') AS Display
FROM MyTable
WHERE Postcode LIKE '%A1 2AB%'

1 个答案:

答案 0 :(得分:2)

使用concat()功能:

SELECT concat(COALESCE(House, ''), ' ', COALESCE(StreetName, ''), ' ',
              COALESCE(TownCity, ''), ' ', COALESCE(Postcode, '')
             ) AS Display
FROM MyTable
WHERE Postcode LIKE '%A1 2AB%';

您也可以使用concat_ws()执行此操作。这消除了对所有空间的需求:

SELECT concat_ws(COALESCE(House, ''), COALESCE(StreetName, ''),
                 COALESCE(TownCity, ''), COALESCE(Postcode, '')
                ) AS Display
FROM MyTable
WHERE Postcode LIKE '%A1 2AB%';

MySQL中发生的事情是+正是您所期望的:它会增加数字。包含数字的字符串会自动转换为数字,对于没有数字的字符串会出现静默错误。实际上,这意味着以非数字(和非小数点)开头的字符串将转换为0

因此,house,可能通常是数字,被转换为数字就好了。所有其他字符串都转换为数字但变为零,并且房屋号码不会更改。如果你的邮政编码是美式邮政编码(通常是数字),你会得到很多不同的结果。

编辑:

正如@fthiella指出的那样,coalesce()不需要concat_ws()。这两个语句会做不同的事情,因为原始查询中的NULL会导致重复的分隔符。 NULL版本中的concat_ws()只有一个分隔符(可能是合适的)。

但是,无论如何,我倾向于保留coalesce()。在这方面,concat()concat_ws()的行为各不相同。 concat()如果其任何参数为NULL,则返回NULLconcat_ws()在初始分隔符后跳过NULL个参数。谁能记住这种区别?这听起来像是生产代码混淆的一个秘诀。所以,即使它是可选的,我也会使用coalesce()