4

リストアイテム(コンマ区切り)を格納するデータベースフィールドを、残念ながらリストアイテムでもある変数と比較しようとしています。

例:

この場合、ユーザーは複数のグループに属することができ、コンテンツアクセスも複数のグループに割り当てられます。

contentid | group  
 (1)   (c,d)   
 (2)   (a,c)  
 (3)   (b)

したがって、ユーザーがグループ(a、c)に含まれるすべてのコンテンツを選択する必要があります。この場合、contentid1,2が返されます。

4

2 に答える 2

2

この質問と回答は役に立つかもしれません:項目 x にアクセスできるように文字列を分割するにはどうすればよいですか?

または、常に次のようなものを使用できます。

create function SplitString(
    @string varchar(max),
    @delimiter char(1)
)
returns @items table (item varchar(max))
as
begin

declare @index int set @index = 0
if (@delimiter is null) set @delimiter = ','
declare @prevdelimiter int set @prevdelimiter = 0

while (@index < len(@string)) begin

    if (substring(@string, @index, 1) = @delimiter) begin
        insert into @items
        select substring(@string, @prevdelimiter, @index-@prevdelimiter)
        set @prevdelimiter = @index + 1
    end

    set @index = @index + 1

end

--last item (or only if there were no delimiters)
insert into @items
select substring(@string, @prevdelimiter, @index - @prevdelimiter + 1)

return
end
go


declare @content table(contentid int, [group] varchar(max))
insert into @content
select 1, 'c,d'
union
select 2, 'a,c'
union
select 3, 'b'

declare @groups varchar(max) set @groups = 'a,c'
declare @grouptable table(item varchar(max))
insert into @grouptable 
select * from dbo.SplitString(@groups, ',')

select * From @content
where (select count(*) from @grouptable g1 join dbo.SplitString([group], ',') g2 on g1.item = g2.item) > 0
于 2012-10-22T16:25:48.297 に答える
2

これは、SQL 2008 の安全だが遅い解決策です。

BEGIN
-- setup
DECLARE @tbl TABLE (
    [contentid] INT
    ,[group] VARCHAR(MAX)
)
INSERT INTO @tbl VALUES
     (1, 'c,d')
    ,(2, 'a,c')
    ,(3, 'd')
-- send your request as simple xml
DECLARE @param XML
SET @param = '<g>a</g><g>c</g>'
-- query
SELECT DISTINCT contentid 
FROM @tbl t
    INNER JOIN @param.nodes('/g') AS t2(g)
        ON ',' + t.[group] + ',' LIKE '%,' + t2.g.value('.', 'varchar(max)') + ',%'
END

コンマ区切りのリストではなく、XML スニペットとしてクエリを渡すだけです。

グループ名が単一の文字である場合、または名前が互いに文字のサブセットではないことが確実な場合 (つまり、GroupA、GroupAB)、クエリを最適化できます。

ON t.[group] LIKE '%' + t2.g.value('.', 'varchar(max)') + '%'

XML 解析機能のない RDBMS を使用している場合は、文字列を使用してクエリを一時テーブルに分割し、そのように処理する必要があります。


列内でカンマ区切りの値を使用しないでください。[group] 列に含まれる値が 1 つだけで、コンポジット (contentid、group) で UNIQUE 制約を使用してエントリを繰り返した場合は、はるかに優れています。

于 2012-10-22T15:53:02.320 に答える