読者です 読者をやめる 読者になる 読者になる

行間を結合するユーザ定義関数の利用

データのカーディナリティが違う場合。


通常は別の表にする。


でもグループ化したときに数値をSUMするようなイメージで、


文字列も結合したいべ。


そういう時はユーザ定義関数を作ってしまう。


CREATE FUNCTIONね。


引数にidとかを渡して、カーソルを使えばよい。


クライアントがアクセスとかの場合はそのユーザ定義関数を使ったVIEWを


用意しておいて、それにリンクテーブルしてもらえば良い。


サンプル


CREATE FUNCTION [dbo].[getItemText] (@id as integer)
RETURNS varchar(1024)
BEGIN

DECLARE @ret as varchar(512)
DECLARE @name as varchar(64)
DECLARE @cnt as integer

SET @ret = ''

DECLARE item CURSOR FOR
SELECT
CASE WHEN M_DELI_STUFF.id = 23 THEN R_SECOND_SOKO_DELI_STUFF.deli_stuff_text ELSE M_DELI_STUFF.name END AS name,
R_SECOND_SOKO_DELI_STUFF.cnt
FROM
M_SECOND_COMMON
LEFT JOIN R_SECOND_SOKO_DELI_STUFF ON M_SECOND_COMMON.id = R_SECOND_SOKO_DELI_STUFF.second_id
LEFT JOIN M_DELI_STUFF ON R_SECOND_SOKO_DELI_STUFF.deli_stuff_id = M_DELI_STUFF.id
WHERE
M_SECOND_COMMON.id = @id AND M_DELI_STUFF.id != 7
OPEN item
FETCH NEXT FROM item INTO
@name, @cnt

WHILE @@FETCH_STATUS = 0
BEGIN
IF @ret = ''
SET @ret = @name + '-' + cast(@cnt as varchar) + '個'
ELSE
SET @ret = @ret + ' / ' + @name + '-' + cast(@cnt as varchar) + '個'

FETCH NEXT FROM item INTO
@name, @cnt
END
CLOSE item
DEALLOCATE item

RETURN @ret

END