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