1

3 つの住所フィールドを持つテーブルがあり、各住所フィールドにはそれぞれ 100 文字の制限があります。

各住所フィールドの最大文字数制限を 30 文字にするクエリを作成する必要があります。1 つの住所フィールドが 30 を超える場合は、残りを切り取り、残りを次の住所フィールドの先頭に連結します。最後のアドレス フィールド (address3) がいっぱいになるまでこれを行い、最後のアドレス フィールドの残りを取り除くだけです。

これを SQL クエリまたは T-SQL で行う方法はありますか?

4

2 に答える 2

3

非常に短いアドレスをどうするかは指定されていませんが、私の最初のクラックは次のようなものです。

with temp as
(
  select 1 id, 'abcdefghijklmnopqrstuvwxyz123456789' part1, 'second part' part2, 'third part' part3
),
 concated as
(
  SELECT id, part1 + part2 + part3 as whole
  FROM temp
)
select  id, 
        SUBSTRING(whole, 0, 30) f, 
        SUBSTRING(whole, 30,30) s, 
        SUBSTRING(whole, 60,30) t 
from concated

これは以下を返します:

id  | f                               | s                            | t
1   | abcdefghijklmnopqrstuvwxyz123   | 456789second partthird part  |  

それがあなたが探しているものでない場合は、上記の目的の出力を指定してください。

アップデート:

うーん...これは機能しているように見えますが、かなりひどいです。誰かがより良い解決策を思い付くことができると確信しています。

with temp as
(
  select 1 id, 'abcdefghijklmnopqrstuvwxyz123456789 ' part1, 'second part' part2, 'third part' part3
)
select  id, 
        SUBSTRING(part1, 0, 30) f, 
        SUBSTRING(SUBSTRING(part1, 30, 70) + SUBSTRING(part2, 0,30),0,30) s, 
        SUBSTRING(SUBSTRING(SUBSTRING(SUBSTRING(part1, 30, 70) + SUBSTRING(part2, 0,30),30,70),0,30) + SUBSTRING(part3, 0,30),0,30) t 
from temp
于 2012-06-15T21:46:49.683 に答える
1

私は問題の説明に行き、「明らかに」正しいものを書くと思います(あなたの仕様を理解していれば:-))

/* Setup data - second example stolen from Abe, first just showing that it works with short enough data */
declare @t table (ID int not null,Address1 varchar(100) not null,Address2 varchar(100) not null,Address3 varchar(100) not null)
insert into @t (ID,Address1,Address2,Address3)
values (1,'abc','def','ghi'),
(2,'abcdefghijklmnopqrstuvwxyz123456789 ', 'second part', 'third part')

/* Actual query - shift address pieces through the address fields, but only to later ones */
;with Shift1 as (
    select
        ID,SUBSTRING(Address1,1,30) as Address1,SUBSTRING(Address1,31,70) as Address1Over,Address2,Address3
    from @t
), Shift2 as (
    select
        ID,Address1,SUBSTRING(Address1Over+Address2,1,30) as Address2,SUBSTRING(Address1Over+Address2,31,70) as Address2Over,Address3
    from Shift1
), Shift3 as (
    select
        ID,Address1,Address2,SUBSTRING(Address2Over+Address3,1,30) as Address3
    from Shift2
)
select * from Shift3

結果:

ID            Address1                          Address2                          Address3
----------- ------------------------------ ------------------------------ ------------------------------
1           abc                                 def                                ghi
2           abcdefghijklmnopqrstuvwxyz1234   56789 second part                 third part
于 2012-06-17T05:17:41.560 に答える