2017-09-07 109 views
1

我想将计算列添加到SQL数据库。计算列规范看起来像这样SQL Server计算列修整

BusinessName +''+姓氏+''+名字
它工作正常。

通常情况下,BUSINESSNAME是空白的,所以我想修一修

TRIM(BUSINESSNAME + '' +姓氏+ '' +姓)

但是当我做我得到一个错误

+4

没有修剪(),而不是使用LTRIM()| rtrim() –

+0

指定列数据类型 – etsa

+0

@AlexK。有从2017年https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql –

回答

2

你可以使用下面的逻辑,

第一种选择:检查值为空,由空字符串替换它,你将拥有领先的空空间,如果BUSINESSNAME是空

isnull(BusinessName, '') + ' ' + Surname + ' ' + FirstName 

第二个选项:检查是否BUSINESSNAME为空或空,如果是不考虑。如果BusinessName为空或空,则不会有空白空间

case when isnull(BusinessName, ' ') <> ' ' 
    then BusinessName + ' ' + Surname + ' ' + FirstName 
else Surname + ' ' + FirstName 
end as FullName 
+1

你的第二个解决方案是更优雅,因为前者将在事件的领先空间该BusinessName是NULL /空白。好答案。 – Eli

+0

@Eli,谢谢,你是绝对正确的,我也会使用第二个选项。 – PawelCz

0

我认为这取决于列数据类型和约束。更一般的方法可以是以下。以此为出发点,如果作为一项规则姓氏和名字(例如)不可为空并且不能为空,可以省略一些功能:

DECLARE @T AS TABLE (BUSIN_NAME VARCHAR(20), SURNAME VARCHAR(20), NAME VARCHAR(20)) 
INSERT INTO @T VALUES(NULL, NULL, NULL); 
INSERT INTO @T VALUES(NULL, 'A', NULL); 
INSERT INTO @T VALUES(NULL, 'B ', NULL); 
INSERT INTO @T VALUES('', 'Karl ', ' Smith'); 
INSERT INTO @T VALUES('Dr.', 'Karl ', ' Smith'); 
INSERT INTO @T VALUES('Dr. ', 'Joe ', ' Martin '); 

SELECT BUSIN_NAME, SURNAME, NAME 
    , LTRIM(RTRIM(LTRIM(RTRIM(ISNULL(BUSIN_NAME,'')))+ ' ' + LTRIM(RTRIM(ISNULL(SURNAME,'')))+' ' +LTRIM(RTRIM(ISNULL(NAME,''))))) DESCR 
    , DATALENGTH (LTRIM(RTRIM(LTRIM(RTRIM(ISNULL(BUSIN_NAME,'')))+ ' ' + LTRIM(RTRIM(ISNULL(SURNAME,'')))+' ' +LTRIM(RTRIM(ISNULL(NAME,'')))))) AS LENGTH 
    FROM @T 

输出:

BUSIN_NAME SURNAME NAME DESCR    LENGTH 
NULL  NULL NULL      0 
NULL  A  NULL A     1 
NULL  B  NULL B     1 
      Karl  Smith Karl Smith   10 
Dr.   Karl  Smith Dr. Karl Smith  14 
Dr.   Joe  Martin  Dr. Joe Martin 14 
0

我建议做如下:

select stuff((coalesce(' ' + BusinessName, '') + 
       coalesce(' ' + Surname, '') + 
       coalesce(' ' + Firstname, '') 
      ), 1, 1, '') 

这些很容易推广到更多的领域。您可以使用ltrim()而不是stuff(),因为您将空格用作分隔符。 stuff()更通用,因为它处理其他分隔符(特别是逗号)。

作为计算列:

alter table t add newcol as 
    (stuff((coalesce(' ' + BusinessName, '') + 
      coalesce(' ' + Surname, '') + 
      coalesce(' ' + Firstname, '') 
      ), 1, 1, '' 
     ) 
    ) 
+0

非常感谢您的答复 –