他の人が述べたように、テーブルの設計は基本的なデータベース設計の原則に違反しており、それを回避する方法がない場合は、少しのコードでテーブルを正規化し (以下の例)、他のテーブルと結合することができます。どうぞ:
データ:
CREATE TABLE data(RecNum varchar(20),Title varchar(10),Category varchar(15))
INSERT INTO data
VALUES('wja-2012-000001','abcdef','4,6'),
('wja-2012-000002','qwerty','1,3,7'),
('wja-2012-000003','asdffg',null),
('wja-2012-000004','zxcvbb','2,7'),
('wja-2012-000005','ploiuh','3,4,12')
この関数は、カンマ区切りの文字列を受け取り、テーブルを返します。
CREATE FUNCTION listToTable (@list nvarchar(MAX))
RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
DECLARE @pos int,
@nextpos int,
@valuelen int
SELECT @pos = 0, @nextpos = 1
WHILE @nextpos > 0
BEGIN
SELECT @nextpos = charindex(',', @list, @pos + 1)
SELECT @valuelen = CASE WHEN @nextpos > 0
THEN @nextpos
ELSE len(@list) + 1
END - @pos - 1
INSERT @tbl (number)
VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
SELECT @pos = @nextpos
END
RETURN
END
次に、次のようにしてテーブルを「正規化」できます。
SELECT *
FROM data m
CROSS APPLY listToTable(m.Category) AS t
where Category is not null
次に、上記のクエリの結果を使用して、「他の」テーブルと結合します。例(このクエリはテストしていません):
select * from otherTable a
join listToTable('1,3,5,6,8') b
on a.Category = b.number
join(
SELECT *
FROM data m
CROSS APPLY listToTable(m.Category) AS t
where Category is not null
) c
on a.category = c.number