SQL Server计算列修剪

时间:2017-09-07 14:57:28

标签: sql sql-server

我正在尝试将计算列添加到SQL数据库中。计算列规范如下所示

BusinessName +''+ Surname +''+ FirstName
哪个工作正常。

BusinessName通常是空白的,所以我想修剪它

修剪(BusinessName +''+ Surname +''+ FirstName)

但是当我这样做时,我收到错误

3 个答案:

答案 0 :(得分:2)

您可以使用以下逻辑,

第一个选项:检查value是否为null,将其替换为空字符串,如果BusinessName为null,则将有前导空格

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

第二个选项:检查BusinessName是否为空或为空,如果是,则不考虑。如果BusinessName为null或为空

,则不会有前导空格
case when isnull(BusinessName, ' ') <> ' '
    then BusinessName + ' ' + Surname + ' ' + FirstName
else Surname + ' ' + FirstName
end as FullName

答案 1 :(得分:0)

我认为这取决于列数据类型和约束。更一般的方法可能如下。从此开始,如果通常SURNAME和NAME(例如)不是NULLABLE且不能为空,则可以省略一些功能:

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

答案 2 :(得分: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, ''
          )
    )