如何在 SQL 中串联
How to Concatenate in SQL
在 SQL Server 2012 中,我正在尝试 select 多个列并将它们连接起来,如下所示。
LTRIM(RTRIM(ISNULL(S.TITLE, ''))) +
' ' +
LTRIM(RTRIM(ISNULL(S.FIRSTNAME, ''))) +
' ' + LTRIM(RTRIM(ISNULL(S.SURNAME, ''))) AS 'Full Name',
我遇到的问题是,如果第一列 'TITLE' 为 NULL 或空白,那么下一列 'FIRSTNAME' 由于连接而以 space 开头。
有什么想法吗?
P.S - 这是我的第一个问题,如果我做错了什么,我深表歉意....
在 LTRIM(
内包含整个
LTRIM(LTRIM(RTRIM(ISNULL(S.TITLE, ''))) +
' ' +
LTRIM(RTRIM(ISNULL(S.FIRSTNAME, ''))) +
' ' + LTRIM(RTRIM(ISNULL(S.SURNAME, '')))) AS 'Full Name',
您可以在整个表达式周围使用 ltrim()
来解决该问题:
LTRIM(LTRIM(RTRIM(ISNULL(S.TITLE, ''))) + ' ' + LTRIM(RTRIM(ISNULL(S.FIRSTNAME, ''))) + ' ' + LTRIM(RTRIM(ISNULL(S.SURNAME, '')))) AS [Full Name],
有用的提示:不要对列别名使用单引号。虽然这有时有效,但在其他时候,代码不会按您的预期进行。仅对字符串和日期常量使用单引号。
还有其他的方法,比如在NULL
的测试前加上space
(COALESCE(LTRIM(RTRIM(s.Title)) + ' ', '') +
COALESCE(LTRIM(RTRIM(S.FirstName)) + ' ', '') +
COALESCE(LTRIM(RTRIM(s.SurName)), '')
)
如果没有名字,这样做的好处是可以处理双 space。但是,您将需要一个 rtrim()
来使整个表达式不处理姓氏。
像下面这样使用它。为了清楚起见,我省略了 LTRIM()
和 RTRIM()
。并使用 COALESCE()
代替 ISNULL()
SELECT
COALESCE( s.Title + ' ', '') + COALESCE( s.Firstname + ' ', '') +
+ COALESCE( s.surname, '')
在 COALESCE()
内使用修剪。例如;
COALESCE( LTRIM(RTRIM( s.Title)) + ' ', '')
使用 sqlserver 2012 中引入的 CONCAT 可以很容易地解决这个问题。
SELECT
CONCAT(LTRIM(RTRIM(S.TITLE)) + ' ',
LTRIM(RTRIM(S.FIRSTNAME)) + ' ',
LTRIM(RTRIM(S.SURNAME))) AS [Full Name]
FROM ..
在 SQL Server 2012 中,我正在尝试 select 多个列并将它们连接起来,如下所示。
LTRIM(RTRIM(ISNULL(S.TITLE, ''))) +
' ' +
LTRIM(RTRIM(ISNULL(S.FIRSTNAME, ''))) +
' ' + LTRIM(RTRIM(ISNULL(S.SURNAME, ''))) AS 'Full Name',
我遇到的问题是,如果第一列 'TITLE' 为 NULL 或空白,那么下一列 'FIRSTNAME' 由于连接而以 space 开头。
有什么想法吗?
P.S - 这是我的第一个问题,如果我做错了什么,我深表歉意....
在 LTRIM(
LTRIM(LTRIM(RTRIM(ISNULL(S.TITLE, ''))) +
' ' +
LTRIM(RTRIM(ISNULL(S.FIRSTNAME, ''))) +
' ' + LTRIM(RTRIM(ISNULL(S.SURNAME, '')))) AS 'Full Name',
您可以在整个表达式周围使用 ltrim()
来解决该问题:
LTRIM(LTRIM(RTRIM(ISNULL(S.TITLE, ''))) + ' ' + LTRIM(RTRIM(ISNULL(S.FIRSTNAME, ''))) + ' ' + LTRIM(RTRIM(ISNULL(S.SURNAME, '')))) AS [Full Name],
有用的提示:不要对列别名使用单引号。虽然这有时有效,但在其他时候,代码不会按您的预期进行。仅对字符串和日期常量使用单引号。
还有其他的方法,比如在NULL
的测试前加上space(COALESCE(LTRIM(RTRIM(s.Title)) + ' ', '') +
COALESCE(LTRIM(RTRIM(S.FirstName)) + ' ', '') +
COALESCE(LTRIM(RTRIM(s.SurName)), '')
)
如果没有名字,这样做的好处是可以处理双 space。但是,您将需要一个 rtrim()
来使整个表达式不处理姓氏。
像下面这样使用它。为了清楚起见,我省略了 LTRIM()
和 RTRIM()
。并使用 COALESCE()
代替 ISNULL()
SELECT
COALESCE( s.Title + ' ', '') + COALESCE( s.Firstname + ' ', '') +
+ COALESCE( s.surname, '')
在 COALESCE()
内使用修剪。例如;
COALESCE( LTRIM(RTRIM( s.Title)) + ' ', '')
使用 sqlserver 2012 中引入的 CONCAT 可以很容易地解决这个问题。
SELECT
CONCAT(LTRIM(RTRIM(S.TITLE)) + ' ',
LTRIM(RTRIM(S.FIRSTNAME)) + ' ',
LTRIM(RTRIM(S.SURNAME))) AS [Full Name]
FROM ..