質問するログイン新規登録

回答編集履歴

4

誤字

2017/09/05 15:57

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  (5,'名刺が必要','来週対応','休み','お酒NG')
15
15
  ;
16
16
  ```
17
- SELECE
17
+ SELECT
18
18
  ---
19
19
  ```SQL
20
20
  with

3

修正

2017/09/05 15:57

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -19,8 +19,9 @@
19
19
  ```SQL
20
20
  with
21
21
  step1 as (-- 対象項目を空白区切りで結合
22
- select COALESCE(REPLACE(CAST(FA as varchar), ' ', ' '), '') + COALESCE(' ' + REPLACE(CAST(FB as varchar), ' ', ' '), '')
22
+ select REPLACE(COALESCE(CAST(FA as varchar),'')+COALESCE(space(1) + CAST(FB as varchar), '')
23
- + COALESCE(' ' + REPLACE(CAST(FC as varchar), ' ', ' '), '') + COALESCE(' ' + REPLACE(CAST(FD as varchar), ' ', ' '), '') as note
23
+ +COALESCE(space(1) + CAST(FC as varchar), '')+COALESCE(space(1) + CAST(FD as varchar), '')
24
+ , ' ', space(1)) as note
24
25
  from tbl
25
26
  ),
26
27
  step2 as (-- キーワードの位置算定
@@ -37,4 +38,4 @@
37
38
  from step4
38
39
  ```
39
40
  ネストせずに記述もできますが、さすがに可読性が半端なく低下するので、WITH式でネストしています。
40
- ※可読性を考慮しWITH式に修正
41
+ ※可読性を考慮しWITH式に修正。REPLACE部分が冗長だったので修正。

2

修正

2017/09/05 09:52

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -17,21 +17,24 @@
17
17
  SELECE
18
18
  ---
19
19
  ```SQL
20
+ with
21
+ step1 as (-- 対象項目を空白区切りで結合
22
+ select COALESCE(REPLACE(CAST(FA as varchar), ' ', ' '), '') + COALESCE(' ' + REPLACE(CAST(FB as varchar), ' ', ' '), '')
23
+ + COALESCE(' ' + REPLACE(CAST(FC as varchar), ' ', ' '), '') + COALESCE(' ' + REPLACE(CAST(FD as varchar), ' ', ' '), '') as note
24
+ from tbl
25
+ ),
26
+ step2 as (-- キーワードの位置算定
27
+ select note, CHARINDEX(case when CHARINDEX('様', note)>0 then '様' else '殿' end, note) as ptn_idx from step1
28
+ ),
29
+ step3 as (-- キーワードの位置までの文字列を逆転
30
+ select note, ptn_idx, REVERSE(SUBSTRING(note, 1, ptn_idx)) as rvrs_str from step2
31
+ ),
32
+ step4 as (-- 逆転した文字列の空白位置を算定
33
+ select note, rvrs_str, CHARINDEX(space(1), rvrs_str) as split_idx from step3
34
+ )
20
35
  -- 逆転した文字列の空白位置までを取り出し再度逆転
21
36
  select REVERSE(case when split_idx>0 then SUBSTRING(rvrs_str, 1, split_idx-1) else rvrs_str end) fchr, note
22
- from ( -- 逆転した文字列の空白位置を算定
23
- select note, rvrs_str, CHARINDEX(space(1), rvrs_str) as split_idx
24
- from ( -- キーワードの位置までの文字列を逆転
25
- select note, ptn_idx, REVERSE(SUBSTRING(note, 1, ptn_idx)) as rvrs_str
26
- from ( -- キーワードの位置算定
27
- select note, CHARINDEX(case when CHARINDEX('様', note)>0 then '様' else '殿' end, note) as ptn_idx
28
- from ( -- 対象項目を空白区切りで結合
29
- select COALESCE(REPLACE(CAST(FA as varchar), ' ', ' '), '') + COALESCE(' ' + REPLACE(CAST(FB as varchar), ' ', ' '), '')
30
- + COALESCE(' ' + REPLACE(CAST(FC as varchar), ' ', ' '), '') + COALESCE(' ' + REPLACE(CAST(FD as varchar), ' ', ' '), '') as note
31
- from tbl
37
+ from step4
32
- ) step1
33
- ) step2
34
- ) step3
35
- ) step4
36
38
  ```
37
- ネストせずに記述もできますが、さすがに可読性が半端なく低下するので、ネストしています。
39
+ ネストせずに記述もできますが、さすがに可読性が半端なく低下するので、WITH式でネストしています。
40
+ ※可読性を考慮しWITH式に修正

1

修正

2017/09/05 07:53

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -26,8 +26,8 @@
26
26
  from ( -- キーワードの位置算定
27
27
  select note, CHARINDEX(case when CHARINDEX('様', note)>0 then '様' else '殿' end, note) as ptn_idx
28
28
  from ( -- 対象項目を空白区切りで結合
29
- select REPLACE(CAST(FA as varchar), ' ', ' ') + ' ' + REPLACE(CAST(FB as varchar), ' ', ' ')
29
+ select COALESCE(REPLACE(CAST(FA as varchar), ' ', ' '), '') + COALESCE(' ' + REPLACE(CAST(FB as varchar), ' ', ' '), '')
30
- + ' ' + REPLACE(CAST(FC as varchar), ' ', ' ') + ' ' + REPLACE(CAST(FD as varchar), ' ', ' ') as note
30
+ + COALESCE(' ' + REPLACE(CAST(FC as varchar), ' ', ' '), '') + COALESCE(' ' + REPLACE(CAST(FD as varchar), ' ', ' '), '') as note
31
31
  from tbl
32
32
  ) step1
33
33
  ) step2