SQLステートメントのフィールドから先行ゼロを削除する


98

SQLServerデータベースから読み取り、抽出ファイルを生成するSQLクエリに取り組んでいます。単純なVARCHAR(10)フィールドである特定のフィールドから先行ゼロを削除するための要件の1つ。したがって、たとえば、フィールドに「00001A」が含まれている場合、SELECTステートメントはデータを「1A」として返す必要があります。

この方法で先行ゼロを簡単に削除する方法はSQLにありますか?RTRIM関数があることは知っていますが、これはスペースを削除するだけのようです。


3
デビッド・ウォーカーさんにupvoteとしてstackoverflow.com/a/11129399/1635441の応答、アルヴォの回答を参照してください投稿:stackoverflow.com/a/662437/1635441を
ramizmoh

回答:


151
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)

8
文字列が完全に「0」で構成されている場合、「0」以外の文字とは一致しないため、これには問題があります。
Cade Roux、

そうだね。この場合、変更されていないすべてのゼロの文字列を返します。これが問題の場合は、patindexの戻り値をゼロに対してテストする必要があります。
Ian Horwill

@Zapnologica:いいえ。 "update TableName set ColumnName = ..."ステートメントに挿入する必要があります。
Ian Horwill、2014

確かに、Updateステートメントを使用している場合は。
Srivastav

1
このソリューションを使用する前に、ここに掲載されている
OscarSosa

26
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')

「Replace関数には3つの引数が必要」と表示されました。select replace(ltrim(replace(ColumnName、 '0'、 ''))、 ''、 '0')
brentlightsey

5
値にスペースがある場合、これは失敗します。例:「0001 B」は「1 B」になるはずですが、代わりに「10B」になります。
Omaer 2014年

1
@Omaerが言及したように、文字列にいくつかのスペースがある場合、これは安全ではありません。改善された解決策-最初にスペースを入力に入る可能性が低いcharに置き換え、0-ltrimの後で、これらのcharをスペースに戻します。最終的には非常に複雑に見えます:(例:select replace(replace(ltrim(replace(replace( '000309933200,00 USD'、 ''、 '|')、 '0'、 ''))、 ''、 '0 ')、' | '、' ')-> 309933200,00 USD
Robert Lujo

4
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20), 
    patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 
    20)), 20)

戻り値はN0Z、つまり、先行ゼロとその前にあるすべてのものを取り除きます。


5
その前に何かが来る場合、それはどのように先行ゼロですか?
xxbbcc 14

4

私は同じ必要性があり、これを使用しました:

select 
    case 
        when left(column,1) = '0' 
        then right(column, (len(column)-1)) 
        else column 
      end

3

クエリがゼロの文字列やその他の値の代わりに0を返すようにする場合は、これを次のようなcaseステートメントに変換できます。

select CASE
      WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
       THEN '0'
      ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10) 
      END

2

あなたはこれを使うことができます:

SELECT REPLACE(LTRIM(REPLACE('000010A', '0', ' ')),' ', '0')

0

これを試すことができます- 必要に応じて先行ゼロのみを削除するように特別な注意が必要です:

DECLARE @LeadingZeros    VARCHAR(10) ='-000987000'

SET @LeadingZeros =
      CASE WHEN PATINDEX('%-0', @LeadingZeros) = 1   THEN 
           @LeadingZeros
      ELSE 
           CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 
      END   

SELECT @LeadingZeros

または単に呼び出すことができます

CAST(CAST(@LeadingZeros AS INT) AS VARCHAR(10)) 

0

文字列から先行ゼロを削除するSQLスカラー値関数は次のとおりです。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      Vikas Patel
-- Create date: 01/31/2019
-- Description: Remove leading zeros from string
-- =============================================
CREATE FUNCTION dbo.funRemoveLeadingZeros 
(
    -- Add the parameters for the function here
    @Input varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @Result varchar(max)

    -- Add the T-SQL statements to compute the return value here
    SET @Result = @Input

    WHILE LEFT(@Result, 1) = '0'
    BEGIN
        SET @Result = SUBSTRING(@Result, 2, LEN(@Result) - 1)
    END

    -- Return the result of the function
    RETURN @Result

END
GO


-1

次のステートメントから月の先頭の0を削除することは確実に機能します。

SELECT replace(left(Convert(nvarchar,GETDATE(),101),2),'0','')+RIGHT(Convert(nvarchar,GETDATE(),101),8) 

GETDATE()テーブルの日付フィールドに置き換えるだけです。


3
これはどれほど正確に質問に答えますか?
deutschZuid 2014

-2

あなたはこれを試すことができます SELECT REPLACE(columnname,'0','') FROM table


3
これにより、その位置に関係なく0が削除されます。質問は主要なものだけについて尋ねています。
2018年

-2

先頭の0を削除するには、数値列に1を掛けることができます。例:Select(ColumnName * 1)


3
「1A」* 1は何に等しいですか?
ジョナサン・リス

10 * 1は何になりますか?
RATAN KUMAR

質問で、列タイプはVARCHAR(10)であるため、乗算はできません。
y434y

-2
select replace(replace(rtrim(replace(replace(replace(replace(ltrim(replace(replace([COLUMN],' ','[Ltrim]'),[Ltrim],' ')),' ',[Ltrim]),'[Ltrim]',' '),' ','[Rtrim]'),[Rtrim],' ')),' ',[Rtrim]),'[Rtrim]',' ') As Result

これは、2017年より前のtsqlでTRIMコマンドの機能をエミュレートするSqlスクリプトであり、基本的に他の推奨事項と同じですが、他の文字は、まだ発生する可能性のある単一の珍しい文字「[Rtrim]」または「[ Ltrim] 'はまだテキストで発生する可能性がありますが、帽子を一意のテキストで置き換えると、たとえばGuidがその問題を解決します。

速度についてはテストしていません


-3

上記のアイデアを借りました。これは高速でもエレガントでもありません。しかしそれは正確です。

場合

WHEN left(column, 3) = '000' THEN right(column, (len(column)-3))

WHEN left(column, 2) = '00' THEN right(a.column, (len(column)-2))

WHEN left(column, 1) = '0' THEN right(a.column, (len(column)-1))

ELSE 

終わり


3つを超えるゼロを許容することも動的ではありません。
JoeFletch 2017年

-3
select CASE
         WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
           THEN ''
           ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
       END

1
単一のコードスニペットだけでなく、回答について説明する必要があります。また、コードをコードとしてフォーマットしてください(テキスト入力ボックスの上部にボタンがあります)。
David Heyman

-4
select ltrim('000045', '0') from dual;

LTRIM
-----
45

これで十分です。


2
SQLサーバーのオーバーロードはありません。
BillRob 14

PostgreSQLではを書くだけで十分ですselect trim(leading '0' from '001A');が、OPはSQL Serverを求めていました。
y434y
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.