在SQL Server 2012中,我正在尝试选择多列并将它们连接起来,如下所示。
LTRIM(RTRIM(ISNULL(S.TITLE, ''))) +
' ' +
LTRIM(RTRIM(ISNULL(S.FIRSTNAME, ''))) +
' ' + LTRIM(RTRIM(ISNULL(S.SURNAME, ''))) AS 'Full Name',
我遇到的问题是,如果第一列'TITLE'为NULL或Blank,那么下一列'FIRSTNAME'会因为连接而以空格开头。
有什么想法吗?
P.S - 这是我的第一个问题,如果我做错了,请道歉......
答案 0 :(得分:1)
将整个内容包含在LTRIM(
LTRIM(LTRIM(RTRIM(ISNULL(S.TITLE, ''))) +
' ' +
LTRIM(RTRIM(ISNULL(S.FIRSTNAME, ''))) +
' ' + LTRIM(RTRIM(ISNULL(S.SURNAME, '')))) AS 'Full Name',
答案 1 :(得分:1)
您可以在整个表达式周围使用ltrim()
解决该问题:
LTRIM(LTRIM(RTRIM(ISNULL(S.TITLE, ''))) + ' ' + LTRIM(RTRIM(ISNULL(S.FIRSTNAME, ''))) + ' ' + LTRIM(RTRIM(ISNULL(S.SURNAME, '')))) AS [Full Name],
有用的提示:不要使用单引号作为列别名。虽然这有时会起作用,但在其他时候,代码将无法满足您的期望。仅对字符串和日期常量使用单引号。
还有其他方法,例如在测试之前添加空格
(COALESCE(LTRIM(RTRIM(s.Title)) + ' ', '') +
COALESCE(LTRIM(RTRIM(S.FirstName)) + ' ', '') +
COALESCE(LTRIM(RTRIM(s.SurName)), '')
)
如果没有名字,这有处理双空格的优点。但是,您需要rtrim()
表示整个表达式不能处理姓氏。
答案 2 :(得分:0)
如下所示使用它。为清楚起见,我省略了LTRIM()
和RTRIM()
。并使用COALESCE()
insted ISNULL()
SELECT
COALESCE( s.Title + ' ', '') + COALESCE( s.Firstname + ' ', '') +
+ COALESCE( s.surname, '')
在COALESCE()
内使用修剪。例如;
COALESCE( LTRIM(RTRIM( s.Title)) + ' ', '')
答案 3 :(得分:0)
使用sqlserver 2012中引入的CONCAT可以很容易地解决这个问题。
SELECT
CONCAT(LTRIM(RTRIM(S.TITLE)) + ' ',
LTRIM(RTRIM(S.FIRSTNAME)) + ' ',
LTRIM(RTRIM(S.SURNAME))) AS [Full Name]
FROM ..