3

SQL World City/State データベースを購入しました。状態データベースでは、状態名が一緒にプッシュされています。例: 「ノースカロライナ」または「サウスカロライナ」...

SQL でループして大文字を検索し、スペースを追加する方法はありますか?

このように「ノースカロライナ」は「ノースカロライナ」になります???

4

3 に答える 3

7

この関数を作成します

if object_id('dbo.SpaceBeforeCaps') is not null
    drop function dbo.SpaceBeforeCaps
GO
create function dbo.SpaceBeforeCaps(@s varchar(100)) returns varchar(100)
as
begin
    declare @return varchar(100);
    set @return = left(@s,1);
    declare @i int;
    set @i = 2;
    while @i <= len(@s)
    begin
        if ASCII(substring(@s,@i,1)) between ASCII('A') and ASCII('Z')
            set @return = @return + ' ' + substring(@s,@i,1)
        else
            set @return = @return + substring(@s,@i,1)
        set @i = @i + 1;
    end;
    return @return;
end;
GO

その後、それを使用してデータベースを更新できます

update tbl set statename = select dbo.SpaceBeforeCaps(statename);
于 2013-05-10T02:18:41.990 に答える
0

関数を絶対に作成できず、これを 1 回限りにする必要がある場合は、再帰 CTE を使用して文字列を分割し (必要に応じて同時にスペースを追加し)、FOR XML を使用して文字を再結合できます。以下の詳細な例:

-- some sample data
create table #tmp (id int identity primary key, statename varchar(100));
insert #tmp select 'NorthCarolina';
insert #tmp select 'SouthCarolina';
insert #tmp select 'NewSouthWales';

-- the complex query updating the "statename" column in the "#tmp" table
;with cte(id,seq,char,rest) as (
    select id,1,cast(left(statename,1) as varchar(2)), stuff(statename,1,1,'')
      from #tmp
     union all
    select id,seq+1,case when ascii(left(rest,1)) between ascii('A') and ascii('Z')
                         then ' ' else '' end + left(rest,1)
         , stuff(rest,1,1,'')
      from cte
     where rest > ''
), recombined as (
  select a.id, (select b.char+''
                  from cte b
                 where a.id = b.id
              order by b.seq
                   for xml path, type).value('/','varchar(100)') fixed
    from cte a
group by a.id
)
update t
   set statename = c.fixed
  from #tmp t
  join recombined c on c.id = t.id
 where statename != c.fixed;

-- check the result
select * from #tmp

----------- -----------
id          statename
----------- -----------
1           North Carolina
2           South Carolina
3           New South Wales
于 2013-05-10T02:28:41.430 に答える
0

これにアプローチするにはいくつかの方法があります

  1. PATINDEXpattern とfeatureを使用して関数を構築します。

  2. ケースごとに最小限のREPLACEステートメントをチェーンします (例:REPLACE(state_name, 'hC', 'h C' for your example case)これはハックのように見えますが、置換のセットが非常に小さいため、実際には最高のパフォーマンスが得られる可能性があります。

于 2013-05-10T02:17:45.383 に答える