C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■97162 / 4階層)  SQLServerからのデータ取得方法について
□投稿者/ 魔界の仮面弁士 (3048回)-(2021/04/08(Thu) 10:19:10)
No97160 (魔界の仮面弁士) に追記
>> 関数を作らない方法はないということでしょうか?
> 関数無しで実装するなら、共通テーブル式で再帰問い合わせをして、
> STRING_AGG 関数あるいは FOR XML PATH 式で連結するとか。

こんな感じかな…。
手元に環境が無いので未検証です。


-- サンプルデータ
CREATE TABLE Sample
 (id int PRIMARY KEY, text nvarchar(100) NULL);


INSERT INTO Sample VALUES
 (1, '001002003004005')
,(2, '003004005006007')
,(3, '003004003004003')
,(4, '1234567')
,(5, '')
,(6, NULL)
;


-- STRING_AGG 版 --
WITH CTE (id, text, pos, chunk) AS (
  SELECT
    Sample.id, Sample.text, pos = CAST(1 AS INT), SUBSTRING(Sample.text, 1, 3) AS chunk
  FROM
    Sample
  UNION ALL
  SELECT
    CTE.id, CTE.text, CTE.pos + 3, SUBSTRING(CTE.text, CTE.pos + 3, 3)
  FROM
    CTE
  WHERE
    ISNULL(SUBSTRING(CTE.text, CTE.pos + 3, 3), '') <> ''
)
SELECT
  CTE.id
, result = STRING_AGG(chunk, '') WITHIN GROUP (ORDER BY CTE.pos)
FROM
  CTE
WHERE
  CTE.chunk NOT IN ('003', '004')
GROUP BY
  CTE.id
ORDER BY
  CTE.id
;


-- FOR XML PATH 版 --
WITH CTE (id, text, pos, chunk) AS (
  SELECT
    Sample.id, Sample.text, pos = CAST(1 AS INT), SUBSTRING(Sample.text, 1, 3) AS chunk
  FROM
    Sample
  UNION ALL
  SELECT
    CTE.id, CTE.text, CTE.pos + 3, SUBSTRING(CTE.text, CTE.pos + 3, 3)
  FROM
    CTE
  WHERE
    ISNULL(SUBSTRING(CTE.text, CTE.pos + 3, 3), '') <> ''
), CTE2 AS (
  SELECT
    CTE.id
  , CTE.pos
  , CTE.chunk
  , CTE.text
  FROM
    CTE
  WHERE
    ISNULL(CTE.chunk, '') NOT IN ('003', '004')
)
SELECT DISTINCT
  CTE2.id
, CTE2.text
, result = (
    SELECT CTE3.chunk+''
	FROM CTE2 AS CTE3
	WHERE CTE3.id = CTE2.id
	ORDER BY CTE3.pos
	FOR XML PATH('')
  )
FROM
  CTE2
ORDER BY
  CTE2.id
;

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[3]: SQLServerからのデータ取得方法について /魔界の仮面弁士 →Re[5]: SQLServerからのデータ取得方法について /紅雀
→Re[5]: SQLServerからのデータ取得方法について /魔界の仮面弁士
 
上記関連ツリー

SQLServerからのデータ取得方法について / 紅雀 (21/04/07(Wed) 10:36) #97147
Re[1]: SQLServerからのデータ取得方法について / 魔界の仮面弁士 (21/04/07(Wed) 11:03) #97148
  └ Re[2]: SQLServerからのデータ取得方法について / 紅雀 (21/04/08(Thu) 09:10) #97159
    └ Re[3]: SQLServerからのデータ取得方法について / 魔界の仮面弁士 (21/04/08(Thu) 09:50) #97160
      └ SQLServerからのデータ取得方法について / 魔界の仮面弁士 (21/04/08(Thu) 10:19) #97162 ←Now
        ├ Re[5]: SQLServerからのデータ取得方法について / 紅雀 (21/04/08(Thu) 11:07) #97163 解決済み
        └ Re[5]: SQLServerからのデータ取得方法について / 魔界の仮面弁士 (21/04/08(Thu) 13:31) #97167 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信