1

SQL Server 2012

関数を使用するテーブルに 3 つの列があります。'[usr].[Udf_OverPunch]'. および部分文字列。

これが私のコードです:

[usr].[Udf_OverPunch](SUBSTRING(col001, 184, 11)) as REPORTED_GAP_DISCOUNT_PREVIOUS_AMOUNT

この機能は、私が必要としていることに適切に機能します。基本的には、データ辞書に基づいて記号や文字を指定の数字に変換しています。

私が抱えている問題は、先行ゼロがあることです。先行ゼロについて質問しましたが、シンボルを int に変換できないため、関数列でそれを行うことはできません。

これは、他の列のコードで先頭のゼロを取り除くために使用しているものです (ただし、ゼロを 1 つ残します)。

cast(cast(SUBSTRING(col001, 217, 6) as int) as varchar(25)) as PREVIOUS_REPORTING_PERIOD

これは、'000000' の値を 1 つの '0' に、または '000060' の値を '60' に変換する場合にうまく機能しますが、(int に変換しようとした場合) 記号または文字が原因で、関数では機能しません。

前述したように、関数が使用されていないときに次のような値を生成する 3 つの列があります。

'0000019753{'
'0000019748G'
'0000019763H'

ここでの私の目標は、先頭のゼロも削除しながら関数を使用することです (それらがすべてゼロである場合を除き、1 つのゼロを保持します)。

これは、値に整数ではない文字が含まれているため、機能しないことを試みたものです。

[usr].[Udf_OverPunch]cast(cast(SUBSTRING(col001, 184, 6) as int) as varchar(25)) as REPORTED_GAP_DISCOUNT_PREVIOUS_AMOUNT,

何かアイデアがある場合や、さらに情報が必要な場合はお知らせください。:)

4

3 に答える 3

1
select      case when col like '%[^0]%' then substring(col,patindex('%[^0]%',col),len(col)) when col like '%0%' then '0' else col end   

from        tab

また

select      case when col like '%[^0]%' then right(col,len(ltrim(replace(col,'0',' ')))) when col like '%0%' then '0' else col end

from        tab
于 2016-11-03T22:30:12.237 に答える
0

これを試して、

declare @i varchar(50)='0000019753}'--'0000019753'

select case when ISNUMERIC(@i)=1 then 
cast(cast(@i as bigint) as varchar(50)) else @i end

また

[usr].[Udf_OverPunch]( case when ISNUMERIC(col001)=1 then 
cast(cast(col001 as bigint) as varchar(50)) else col001 end)
于 2016-11-04T09:21:39.663 に答える
0

正規表現を使用した置換を可能にする T-SQL CLR 関数で、このような置換を処理しています。したがって、解決策は次のようになります。

[dbo].[fn_Utils_RegexReplace] ([value], '^0{1,}(?=.)', '')

(組み込み)には正規表現のサポートがないため、このような関数を作成する必要がありますT-SQL

T-SQLで正規表現置換関数を作成するには?

例えば:

ここに画像の説明を入力

于 2016-11-04T07:59:36.543 に答える