SQLServerデータベースから読み取り、抽出ファイルを生成するSQLクエリに取り組んでいます。単純なVARCHAR(10)
フィールドである特定のフィールドから先行ゼロを削除するための要件の1つ。したがって、たとえば、フィールドに「00001A」が含まれている場合、SELECTステートメントはデータを「1A」として返す必要があります。
この方法で先行ゼロを簡単に削除する方法はSQLにありますか?RTRIM
関数があることは知っていますが、これはスペースを削除するだけのようです。
SQLServerデータベースから読み取り、抽出ファイルを生成するSQLクエリに取り組んでいます。単純なVARCHAR(10)
フィールドである特定のフィールドから先行ゼロを削除するための要件の1つ。したがって、たとえば、フィールドに「00001A」が含まれている場合、SELECTステートメントはデータを「1A」として返す必要があります。
この方法で先行ゼロを簡単に削除する方法はSQLにありますか?RTRIM
関数があることは知っていますが、これはスペースを削除するだけのようです。
回答:
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')
クエリがゼロの文字列やその他の値の代わりに0を返すようにする場合は、これを次のようなcaseステートメントに変換できます。
select CASE
WHEN ColumnName = substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
THEN '0'
ELSE substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
END
これを試すことができます- 必要に応じて先行ゼロのみを削除するように特別な注意が必要です:
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))
文字列から先行ゼロを削除する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
サイズが不明な文字列から先行ゼロを削除する場合。
STUFFコマンドの使用を検討してください。
これがどのように機能するかの例です。
SELECT ISNULL(STUFF(ColumnName
,1
,patindex('%[^0]%',ColumnName)-1
,'')
,REPLACE(ColumnName,'0','')
)
それがカバーするフィドラーで様々なシナリオを見てください
https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=14c2dca84aa28f2a7a1fac59c9412d48
次のステートメントから月の先頭の0を削除することは確実に機能します。
SELECT replace(left(Convert(nvarchar,GETDATE(),101),2),'0','')+RIGHT(Convert(nvarchar,GETDATE(),101),8)
GETDATE()
テーブルの日付フィールドに置き換えるだけです。
先頭の0を削除するには、数値列に1を掛けることができます。例:Select(ColumnName * 1)
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がその問題を解決します。
速度についてはテストしていません
上記のアイデアを借りました。これは高速でもエレガントでもありません。しかしそれは正確です。
場合
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
終わり
select CASE
WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
THEN ''
ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
END
select ltrim('000045', '0') from dual;
LTRIM
-----
45
これで十分です。
select trim(leading '0' from '001A');
が、OPはSQL Serverを求めていました。