2017-11-01 5 views
2

バージョン情報が1.xyzのvarcharカラムがあります。x、y、zは任意の長さにできます。私は私に必要なバージョンを与える次のSQLを持って1.345.23.5最後の特殊文字の後ろにあるすべての文字を最後の特殊文字の後ろに2文字取得します。SQL Server

する必要があります1.345.23.5dfgdfg1.345.23.5d1.345.23.5する必要がありますが、私はそれは例えば以上2.

であれば2つだけにZの長さを制限する必要がありますこれを達成するための簡単な方法はありますか?

declare @s varchar(50) 
set @s = '1.345.23.5dfgdfg' 
select left(@s,len(@s) - (charindex('.',reverse(@s))-1)) + substring(right(@s,charindex('.',reverse(@s))-1),0,3) 
+0

あなたのクエリで何が悪いのでしょうか? – Sami

+0

不器用で冗長で –

答えて

1

ロジックの一部を凝縮します。

に異なる値を持つ

テスト:

create table t (s varchar(50)) 
insert into t values 
('1.345.23.5dfgdfg') 
,('1.345.23.5d') 
,('1.345.23.3') 

select s, left(s,len(s)+(3-charindex('.',reverse(s)))) 
from t 

rextesterデモ:http://rextester.com/USIW73651

リターンは:

+------------------+------------------+ 
|  s   | (No column name) | 
+------------------+------------------+ 
| 1.345.23.5dfgdfg | 1.345.23.5d  | 
| 1.345.23.5d  | 1.345.23.5d  | 
| 1.345.23.5  | 1.345.23.5  | 
+------------------+------------------+ 
+0

私はテストしたほとんどのケースでうまく動作しますが、回答として受け入れるには4分待たなければなりません –

+0

「1.345.23.3」に変更するとどうなりますか?それが動作します? – Sami

+0

@Samiはい、デモと結果に表示されています – SqlZim

1

あなたは文字列は、常にこの形式を持っていることがわかっている場合は、私が使用するように傾斜させることになります。

select (case when charindex('.', reverse(@s)) < 3 then @s 
      else left(@s, len(@s) - charindex('.', reverse(@s)) + 3) 
     end) 

これはあなたの文とかなり似ているので、あなたはそれが簡単になると思わないかもしれません。

0

Parsename()を使用して分割して追加しますか?通常、IPアドレス、またはより具体的にそれが意図だと使用にrefereceで使用

Demo

declare @s varchar(50) 
set @s = '1.345.23.5dfgdfg' 

Select PARSENAME (@s , 4) +'.'+ 
     PARSENAME (@s , 3) +'.'+ 
     PARSENAME (@s , 2) +'.'+ 
     left(PARSENAME (@s , 1),2) 

:完全修飾オブジェクト

1 =オブジェクト名 2 =スキーマ名 3 =データベース名 4 =サーバー名

関連する問題