【发布时间】:2012-05-23 16:44:46
【问题描述】:
请查看此数据库架构:
create table Person (id int not null identity,
[index] varchar(30),
datecreated datetime,
groupid int)
create table [Group] (id int identity not null, description varchar(30))
样本数据:
insert into Person ([index],datecreated,groupid) values ('4,5,6','2011-01-01',1)
insert into Person ([index],datecreated,groupid) values ('1,2,3','2011-02-02',1)
insert into Person ([index],datecreated,groupid) values ('7,8','2012-02-02',2)
insert into [Group] (description) values ('TestGroup')
insert into [Group] (description) values ('TestGroup2')
请看下面的SQL语句:
select *
from Person
inner join [Group] on Person.groupid = [group].id
where [group].description = 'TestGroup'
order by
left(substring([index], charindex(',', [index]) + 1, 200),
charindex(',', substring([index], charindex(',', [index]) + 1, 200)) - 1)
此 SQL 语句失败并出现以下错误:
传递给 SUBSTRING 函数的长度参数无效。
这是导致此错误的order by 子句,即它试图查找索引列的第三个元素,但第三行不存在第三个元素(只有两个元素)。
但是,我希望 [group].description = 'TestGroup' 过滤掉记录三。情况似乎并非如此。就好像order by 子句在where 子句之前运行。如果从查询中排除 order by 子句,则查询运行。
这是为什么?
【问题讨论】:
-
为什么要在该列中存储逗号分隔值?这通常表明数据库设计非常有问题(您遇到的问题就是由此产生的结果)。
-
@a_horse_with_no_name,这是我继承的系统。它需要重新设计。
-
你知道是什么原因导致优先考虑 GROUP BY 子句吗?
-
@marc_s,是的。看看这里,自己看看:sqlfiddle.com/#!3/29802/1
标签: sql sql-server-2005