考虑Nulls /转换为'x'长度的空间

时间:2012-04-25 23:41:43

标签: sql sql-server-2008

SELECT
CONVERT(CHAR(10), Title)
+ CONVERT(CHAR(75), FirstName)
+ CONVERT(CHAR(75), LastName)
+ CONVERT(CHAR(100), EmailAddress)
FROM
AdventureWorks.Person.Contact 

如果某个值为null,那么在这种情况下我将如何容纳它?

我的最终目标:创建固定长度的输出。

理想情况下:如果它是一个空值,则make是指定长度的空白区域。

提前致谢!

3 个答案:

答案 0 :(得分:4)

您也可以使用CAST CHAR技术,而不是通过复制填充字符串:

create table Person
(Firstname varchar(50) not null,
 Lastname varchar(50) not null,
 Email varchar(50));

insert into Person values
('John Winston','Lennon', 'jwl@beatles.com'),
('James Paul','McCartney', null),
('George','Harrison', 'g@beatles.com'),
('Ringo','Starr', 'rstarkey@beatles.com');


select 
Fullname = 
     CAST(Lastname, AS CHAR(50))
     + CAST(Firstname AS CHAR(50))
     + CAST(COALESCE(Email,'') AS CHAR(50)) 
from person

http://www.sqlfiddle.com/#!3/bb771/1

注意,SQL Fiddle没有错误也没有上面的查询,只是浏览器将多个空格渲染为一个,您可以通过在网格上使用Inspect Element(如果您使用的是Google Chrome)看到它的50个字符。每个CAST上显示50个字符

当然您也可以使用CONVERT http://www.sqlfiddle.com/#!3/bb771/3

select 
    Fullname = 
        CONVERT(CHAR(50), Lastname)
        + CONVERT(CHAR(50), Firstname)
        + CONVERT(CHAR(50), COALESCE(Email,'')) 
from person

当然你也可以使用ISNULL http://www.sqlfiddle.com/#!3/bb771/4

select 
    Fullname = 
        CONVERT(CHAR(50), Lastname)
        + CONVERT(CHAR(50), Firstname)
        + CONVERT(CHAR(50), ISNULL(Email,'')) 
from person

只是为了验证事情是否按预期工作,可视化空间:

with a as
(   
    select 
        Fullname = 
            CONVERT(CHAR(50), Lastname)
            + CONVERT(CHAR(50), Firstname)
            + CONVERT(CHAR(50), COALESCE(Email,''))  
    from person
) 
select replace(Fullname,' ','.') from a

Lennon............................................John.Winston......................................jwl@beatles.com...................................
McCartney.........................................James.Paul..........................................................................................
Harrison..........................................George............................................g@beatles.com.....................................
Starr.............................................Ringo.............................................rstarkey@beatles.com..............................

http://www.sqlfiddle.com/#!3/bb771/8

另一个提示,任何表现杀手,例如应该避免使用unnecessary function call,以便快速查询。在这种情况下,如果Firstname和Lastname在输入上拒绝NULL,则不需要在它们周围放置COALESCE或ISNULL,在这种情况下,我们只是将COALESCE或ISNULL放在电子邮件中

答案 1 :(得分:0)

SELECT  COALESCE( CONVERT(CHAR(10), Title),         REPLICATE(' ', 10)),
        COALESCE( CONVERT(CHAR(75), FirstName),     REPLICATE(' ', 75)),
        COALESCE( CONVERT(CHAR(75), LastName),      REPLICATE(' ', 75)),
        COALESCE( CONVERT(CHAR(100), EmailAddress), REPLICATE(' ', 100))
FROM    AdventureWorks.Person.Contact

您正在寻找的是COALESCE(和REPLICATE,让您的生活更轻松)

或者您可以CONCATLEFT

SELECT LEFT(CONCAT( Title,        REPLICATE(' ',10) ), 10) AS Title,
       LEFT(CONCAT( FirstName,    REPLICATE(' ',75) ), 75) AS FirstName,
       LEFT(CONCAT( LastName,     REPLICATE(' ',75) ), 75) AS LastName,
       LEFT(CONCAT( EmailAddress, REPLICATE(' ',100) ), 100) AS FirstName
FROM   AdventureWorks.Person.Contact

答案 2 :(得分:0)

我完成此操作的最简单方法是使用ISNULL语句。我通常会写出ISNULL(字段,'')或任何我将传递给null的值,例如N / a。此ISNULL命令接受一个值,如果值为null则返回第二个参数,否则返回第一个参数的值。