正如其他人所说,你的表的设计违反了基本的数据库设计原则,如果有没有办法解决它,你可以用很少的代码规范表(例如下面),然后加入另一张桌子。在这里你去:
数据:
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
你有数据库的设计和布局的控制。如果是这样,那么最好将ID列添加到此表中,然后添加另一个将类别映射到ID的表。那么你只需要加入表格。 – pstrjds 2012-08-01 04:31:00
大家好,谢谢你给出的所有答案。我无法控制桌子的设计,因此令人头疼。否则,我会进一步标准化表格。 – iceflamez 2012-08-01 09:44:32