0

- と · の間の文字列を取得する必要があります。これは、GigabitEthernet1/0/1 です。

CW-3D13-SW1 - GigabitEthernet1/0/1 · Uplink to 1K5-Core1
CW-3D13-SW1 - FastEthernet1/0/43 · PHSA-MPAACT-3D13/16 - Cisco 2811 Fa 0/0
c&w-internet-sw-ACB - GigabitEthernet1/0/24 · MPAACT PNG/UBC School of Medicine
c&w-internet-sw-ACB - GigabitEthernet1/0/25 - Int-Link-CW-BCCA-Oak-St

私は以下を使用することができます

SUBSTRING(Caption, CHARINDEX(' - ', Caption) + 3, CHARINDEX(' · ', Caption) - CHARINDEX('- ', Caption) + LEN(' · ') - 3)

そして、それは私が望むものを与えるでしょうが、いくつかの例では、・が-に置き換えられています. 例えば:

c&w-internet-sw-ACB - GigabitEthernet1/0/25 - Int-Link-CW-BCCA-Oak-St

そして、これは私のクエリを壊します。- と - の両方を満たす方法はありますか?

感謝

更新 - 別の条件を追加することは可能ですか? 文字列が以下の場合:

VPN 3030  - PCI Fast Ethernet  

末尾に - または · はありません。この場合、私は - の後のものが欲しいだけです

4

3 に答える 3

4

これを試して

Declare @LeftMarker varchar(3)
Declare @RightMarker varchar(3)
    Set @LeftMarker = ' - '     --<--- Replace this with your choice
    Set @RightMarker = ' · '    --<--- Replace this with your choice

Declare @LMarkerLen int
    Set @LMarkerLen = LEN(@LeftMarker)

SELECT  Case When CHARINDEX(@RightMarker, Caption) > 0 Then
            SUBSTRING(Caption, CHARINDEX(@LeftMarker, Caption) + @LMarkerLen, CHARINDEX(@RightMarker, Caption) - (CHARINDEX(@LeftMarker, Caption) + @LMarkerLen))
        Else
            SUBSTRING(Caption, CHARINDEX(@LeftMarker, Caption) + @LMarkerLen, CHARINDEX(@LeftMarker, Caption, CHARINDEX(@LeftMarker, Caption) + @LMarkerLen) - (CHARINDEX(@LeftMarker, Caption) + @LMarkerLen))
        End AS Result
FROM .......
于 2014-01-08T00:56:43.060 に答える
0

このための min 関数を作成しました。

create function dbo.fnMin( @P1 int, @P2 int)
    returns int
as
begin
    return case when @P1 > @P2 then coalesce(@P2,@P1) else coalesce(@P1,@P2) end;
end
go

2 つの値のうち小さい方を返すだけです。次に、それを使用してRIGHTの後にLEFTを実行できます。実際にはこれを 1 つの select ステートメントに入れることもできますが、私の意見では、私のように分割すると読みやすくなります。試してみてください...うまくいくことを願っています!

select coalesce(left(SubStr, dbo.fnMin(nullif(charindex(' - ',SubStr),0),nullif(charindex(' · ',SubStr),0)) ),SubStr)
from (
    select right([Caption],len([Caption])-(dbo.fnMin(nullif(charindex(' - ',[Caption]),0),nullif(charindex(' · ',[Caption]),0)))-3) as SubStr
    from <YourTableName>
) t

内部の select ステートメントは、最初の " - " または " · " のすべての値をに取得します。次に、外側の select は2 番目の " - " または " · " のすべてのLEFTを取得します


編集:このソリューションには関数が必要なため、sqlfiddle を使用できません...しかし、サンドボックス環境で実行できたものは次のとおりです...

create table dbo.Interfaces (Caption varchar(1000))
go
insert into dbo.Interfaces
values
('CW-3D13-SW1 - GigabitEthernet1/0/1 · Uplink to 1K5-Core1'),
('CW-3D13-SW1 - FastEthernet1/0/43 · PHSA-MPAACT-3D13/16 - Cisco 2811 Fa 0/0'),
('c&w-internet-sw-ACB - GigabitEthernet1/0/24 · MPAACT PNG/UBC School of Medicine'),
('c&w-internet-sw-ACB - GigabitEthernet1/0/25 - Int-Link-CW-BCCA-Oak-St'),
('VPN 3030  - PCI Fast Ethernet')
go

create function dbo.fnMin( @P1 int, @P2 int)
    returns int
as
begin
    return case when @P1 > @P2 then coalesce(@P2,@P1) else coalesce(@P1,@P2) end;
end
go

select coalesce(left(SubStr, dbo.fnMin(nullif(charindex(' - ',SubStr),0),nullif(charindex(' · ',SubStr),0)) ),SubStr)
from (
    select right([Caption],len([Caption])-(dbo.fnMin(nullif(charindex(' - ',[Caption]),0),nullif(charindex(' · ',[Caption]),0)))-3) as SubStr
    from dbo.Interfaces
) t
go

これが結果です...

igabitEthernet1/0/1 
astEthernet1/0/43 
igabitEthernet1/0/24 
igabitEthernet1/0/25 
CI Fast Ethernet

(5 row(s) affected)

このコードから理解できない場合は、書籍のミスターをヒットする時が来ました。;)

于 2014-01-09T21:21:10.927 に答える