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

如果一个值为空,在这种情况下我将如何适应?

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

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

提前致谢!

4

3 回答 3

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

另一个提示,应避免任何性能杀手,例如不必要的函数调用,以使您的查询更快。在这种情况下,如果 Firstname 和 Lastname 在输入中拒绝 NULL,则无需在它们周围放置 COALESCE 或 ISNULL,在这种情况下,我们只需在 Email 上放置 COALESCE 或 ISNULL

于 2012-04-26T01:20:56.030 回答
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

您正在寻找的是COALESCEREPLICATE并使您的生活更轻松)

或者,您可以CONCAT使用LEFT它:

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
于 2012-04-25T23:45:33.750 回答
0

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

于 2012-04-26T01:02:28.703 回答