SQL 连接时服务器控制空格
SQL Server controlling spaces when concatenating
这似乎是一个简单的问题,但却是我似乎总是遇到的问题。
在 SQL 服务器中连接两个(或更多)字段并在字段之间添加 space 时,例如:
SELECT Field1 + ' ' + Field2 FROM table
如果Field1
或Field2
可能是null
,那么我们可以使用ISNULL
将其转换为空字符串,但space仍然存在。我解决这个问题的一种方法是在检查它是否为 null
之前添加 space。然后修剪末端以允许字段中的空字符串。例如:
SELECT LTRIM(RTRIIM(ISNULL(Field1 + ' ','') + ISNULL(Field2, ''))) FROM Table
这会处理任一字段中的空字符串,但如果要以这种方式连接的字段超过 2 个,则会变得很长。
有没有更简单的方法?
更简单的方法:
SELECT COALESCE(Field1 + ' ' + Field2, Field1, Field2, '')
FROM Table
这也避免了 LTRIM
和 RTRIM
字段的更改。
但对于更多字段我使用:
SELECT SUBSTRING(ISNULL(' ' + Field1, '') + ISNULL(' ' + Field2, '')
+ ISNULL(' ' + Field3, '')
+ ISNULL(' ' + Field4, '')
+ ...
+ ISNULL(' ' + FieldN, ''), 2, 4000)
FROM Table
我发现 Aaron Bertrands answer 在使用 NULLS and/or 空字段的组合做类似的事情时非常有帮助。对于我的解决方案,我最终得到了;
SELECT STUFF(COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_line1)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_line2)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_line3)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_suburb)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_state)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_postcode)), ''), ''), 1, 1, '')
AS Address_Detail
这可能不是 "easier way",但它可能会帮助您提出一些替代想法。
这似乎是一个简单的问题,但却是我似乎总是遇到的问题。
在 SQL 服务器中连接两个(或更多)字段并在字段之间添加 space 时,例如:
SELECT Field1 + ' ' + Field2 FROM table
如果Field1
或Field2
可能是null
,那么我们可以使用ISNULL
将其转换为空字符串,但space仍然存在。我解决这个问题的一种方法是在检查它是否为 null
之前添加 space。然后修剪末端以允许字段中的空字符串。例如:
SELECT LTRIM(RTRIIM(ISNULL(Field1 + ' ','') + ISNULL(Field2, ''))) FROM Table
这会处理任一字段中的空字符串,但如果要以这种方式连接的字段超过 2 个,则会变得很长。
有没有更简单的方法?
更简单的方法:
SELECT COALESCE(Field1 + ' ' + Field2, Field1, Field2, '')
FROM Table
这也避免了 LTRIM
和 RTRIM
字段的更改。
但对于更多字段我使用:
SELECT SUBSTRING(ISNULL(' ' + Field1, '') + ISNULL(' ' + Field2, '')
+ ISNULL(' ' + Field3, '')
+ ISNULL(' ' + Field4, '')
+ ...
+ ISNULL(' ' + FieldN, ''), 2, 4000)
FROM Table
我发现 Aaron Bertrands answer 在使用 NULLS and/or 空字段的组合做类似的事情时非常有帮助。对于我的解决方案,我最终得到了;
SELECT STUFF(COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_line1)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_line2)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_line3)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_suburb)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_state)), ''), '') +
COALESCE(' ' + NULLIF(RTRIM(LTRIM(a.address_postcode)), ''), ''), 1, 1, '')
AS Address_Detail
这可能不是 "easier way",但它可能会帮助您提出一些替代想法。