2009-04-22 10 views
8

'field1-field2'として連結されたデータベースから2つのフィールドを返す必要があります。 2番目のフィールドはintですが、先頭に0がある固定長の5として返す必要があります。私が使用している方法は次のとおりです。SQLの先行0をintに追加する最も効率的な方法

SELECT Field1 + '-' + RIGHT('0000' + CAST(Field2 AS varchar),5) FROM ... 

もっと効率的な方法がありますか?

答えて

23

かなりの方法です:負ため

SELECT RIGHT('000000000' + CONVERT(VARCHAR(8),Num), 8) FROM #Numbers 

#NumbersはテーブルでありNumが列であるリンクを、クエリは次のようになり、次節約するために、そうAdding Leading Zeros To Integer Values

または正の値

declare @v varchar(6) 
select @v = -5 

SELECT case when @v < 0 
then '-' else '' end + RIGHT('00000' + replace(@v,'-',''), 5) 
+0

負の数値はどうですか? – MatBailie

+1

これは変換のために数値を含む例外を生成します。キャストが必要です –

+0

負または正の値を行うコードを追加しました – SQLMenace

0

私はこのようにします。

SELECT RIGHT(REPLICATE('0', 5) + CAST(Field2 AS VARCHAR(5),5) 

必ずしもすべてが「より簡単」であるか、より効率的ですが、読みやすいとは限りません。

CREATE FUNCTION LEFTPAD 
      (@SourceString VARCHAR(MAX), 
      @FinalLength INT, 
      @PadChar  CHAR(1)) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    RETURN 
    (SELECT Replicate(@PadChar, @FinalLength - Len(@SourceString)) + @SourceString) 
END 
2

の必要性を取り除くために最適化されることができます。

SELECT RIGHT(REPLACE(STR(@NUM),' ','0'),5) 
6

(CASTまたはCONVERTなし)もう一つの方法:あなたが好きなものを使用することができ、データベース内の関数を持ちたい/余裕がある場合は、「RIGHT」

+0

と答えていますが、代わりに['lpad'](https://www.w3schools.com/sql/func_mysql_lpad.asp)に関する情報を追加してください(str_replace(...)) – knb

+0

優れたソリューション –

0

あなたがゼロの異なる数を追加することによって、最終的な結果では、全文字列の一貫性の数を取得したい場合は、ここで(VSQL用)少しの変更がある

SELECT CONCAT( '0'、9-length(TO_CHAR(var1)))、CAST(var1 AS VARCHAR(9)))をvar1とします。

必要に応じて9を置き換えることができます。

BRD