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

値が null の場合、この状況でどのように対応できますか?

私の最終的な目標は、固定長の出力を作成することです。

理想的には、null 値の場合、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 にはエラーも上記のクエリもありません。ブラウザーが複数のスペースを 1 つにレンダリングするだけです。グリッドで Inspect Element (Google Chrome を使用している場合) を使用すると、50 文字であることを確認できます。ディスプレイには、各キャストで 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

もう 1 つのヒントとして、クエリを高速化するために、不要な関数呼び出しなどのパフォーマンス キラーを避ける必要があります。この場合、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

あなたが探しているのはCOALESCE(そしてREPLICATEあなたの人生を楽にするために)

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 などの null に渡される任意の値を書き出します。この ISNULL コマンドは値を受け取り、値が null の場合は 2 番目のパラメーターを返します。それ以外の場合は、最初のパラメーターの値を返します。

于 2012-04-26T01:02:28.703 に答える