如何在 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 ..