SQLServerデータベースから読み取って抽出ファイルを生成するSQLクエリに取り組んでいます。単純なフィールドである特定のフィールドから先行ゼロを削除するための要件の1つVARCHAR(10)
。したがって、たとえば、フィールドに「00001A」が含まれている場合、SELECTステートメントはデータを「1A」として返す必要があります。
この方法で先行ゼロを簡単に削除する方法はSQLにありますか?関数があることは知っていRTRIM
ますが、これはスペースを削除するだけのようです。
SQLServerデータベースから読み取って抽出ファイルを生成するSQLクエリに取り組んでいます。単純なフィールドである特定のフィールドから先行ゼロを削除するための要件の1つVARCHAR(10)
。したがって、たとえば、フィールドに「00001A」が含まれている場合、SELECTステートメントはデータを「1A」として返す必要があります。
この方法で先行ゼロを簡単に削除する方法はSQLにありますか?関数があることは知っていRTRIM
ますが、これはスペースを削除するだけのようです。
select substring(ColumnName, patindex('%[^0]%',ColumnName), 10)
select replace(ltrim(replace(ColumnName,'0',' ')),' ','0')
select substring(substring('B10000N0Z', patindex('%[0]%','B10000N0Z'), 20),
patindex('%[^0]%',substring('B10000N0Z', patindex('%[0]%','B10000N0Z'),
20)), 20)
N0Z
つまり、先頭のゼロとその前にあるものはすべて削除されます。
私は同じ必要があり、これを使用しました:
select
case
when left(column,1) = '0'
then right(column, (len(column)-1))
else column
end
これを使用できます:
SELECT REPLACE(LTRIM(REPLACE('000010A', '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))
select CASE
WHEN TRY_CONVERT(bigint,Mtrl_Nbr) = 0
THEN ''
ELSE substring(Mtrl_Nbr, patindex('%[^0]%',Mtrl_Nbr), 18)
END
上記のアイデアからお借りしました。これは高速でもエレガントでもありません。しかし、それは正確です。
場合
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 ltrim('000045', '0') from dual;
LTRIM
-----
45
これで十分です。