我只是习惯了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%'
答案 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
,则返回NULL
。 concat_ws()
在初始分隔符后跳过NULL
个参数。谁能记住这种区别?这听起来像是生产代码混淆的一个秘诀。所以,即使它是可选的,我也会使用coalesce()
。