2016-12-21 9 views
0

文字列から特定の部分を取得する必要があります。SQLの文字列から特定の部分を取得する方法

フィールドのPOSITIONには、A-ブロック、M-0000000359ブロック、最後に/の右側のブロックが含まれています。

私が今必要としているのは、/の右側の数字です。,の場合は、カンマまでの数字だけです。

POSITIONの次の出力がA-M-0000000359/10またはA-M-0000000359/10,10になる場合は、両方の場合で今必要な結果は10です。

SQL

SELECT POSITION 
    ,SUBSTRING((REPLACE(POSITION, SUBSTRING((POSITION), 1, CHARINDEX('/', (POSITION), 1)), '')), 1, CHARINDEX('/', (POSITION), 0)) AS TRIM_A 
    ,SUBSTRING((REPLACE(POSITION, SUBSTRING((POSITION), 1, CHARINDEX('/', (POSITION), 1)), '')), 0, CHARINDEX(',', ((REPLACE(POSITION, SUBSTRING((POSITION), 1, CHARINDEX('/', (POSITION), 1)), ''))), 1)) AS TRIM_B 
    ,* 
FROM ORDER 

出力

POSITION    |TRIM_A|TRIM_B 
---------------------|------|------| 
A-M-0000000359/1  |1 
---------------------|------|------| 
A-M-0000000359/1,10 |1,10 1 
+0

例あなたが固定されたポジションで望むものを示してください。これは一般的に真実ですか? –

+0

例(SQLと出力)は、私が現時点で固まっている場所です。あなたの質問に答えた場合、あなたが見る出力が働きます。 – oldsport

+0

あなたの現在のコードの仕事のあなたの質問は何ですか? – scsimon

答えて

3

その後、CASE文でこれを達成することができます。 @position変数を変更してテストしてください。

declare @position varchar(64)= 'A-M-0000000359/1111,10' 

select 
    case 
     when patindex('%,%',@position) > 0 
     then substring(substring(@position,CHARINDEX('/',@position) + 1,len(@position) - CHARINDEX('/',@position)),1,patindex('%,%',substring(@position,CHARINDEX('/',@position) + 1,len(@position) - CHARINDEX('/',@position))) - 1) 
     else substring(@position,CHARINDEX('/',@position) + 1,len(@position) - CHARINDEX('/',@position)) 
    end 
+0

Thx!しかし、それは私に最後の数字だけを与える( '10')。しかし、それはあなたの例「1」に基づいているべきです。 – oldsport

+0

最初のものが必要なので修正しました。今すぐ試す@oldsport – scsimon

+0

'patindex()'の代わりに、 'like'を使うだけです。 –

1

おそらく軽い代替

Declare @YourTable table (Position varchar(50)) 
Insert Into @YourTable values 
('A-M-0000000359/1,10'), 
('A-M-0000000359/1'), 
('A-M-0000000359') 


Select A.* 
     ,Trim_A = case when charindex('/',Position)=0 then '' else substring(Position,charindex('/',Position)+1,50) end 
     ,Trim_B = case when charindex(',',Position)=0 then '' 
        else substring(Position,charindex('/',Position)+1,charindex(',',Position)-charindex('/',Position)-1) 
        end 
From @YourTable A 

戻り

Position    Trim_A Trim_B 
A-M-0000000359/1,10 1,10  1 
A-M-0000000359/1  1 
A-M-0000000359  
+0

誰もいない場合のために余分なステップをとっていることの誇り/ – scsimon

+0

@scsimonユーザーが「この作品はありますが、私はこの条件を持っています。毎回別の情報のドロップ。http://stackoverflow.com/questions/41232461/sql-server-need-to-correct-the-numbering-pattern-from-abc-1-1-1-to-abc- 001-001/41232574#41232574 –

1

あなたはこれを試してみてくださいすることができ、私たちは単にそれがCASE

を使用しないことを理解することは非常にシンプルかつ簡単に見つかりました
create table #test(block varchar(50)) 

insert into #test values 
('A-M-0000000359/10,11'), ('A-M-0000000359/10') 

select substring(block, charindex('/', block)+1, 
    case when charindex(',', block) = 0 then 
     len(block) 
    else 
     (charindex(',', block)-1)-charindex('/', block) 
    end) finalValue 
from #test 

OUTPUT 
---------- 
finalValue 
10 
10 
関連する問題