次のデータベース スキーマをご覧ください。
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
句です。つまり、インデックス列の 3 番目の要素を見つけようとしていますが、3 番目の要素が行 3 に存在しません (要素が 2 つしかありません)。
ただし、[group].description = 'TestGroup'
レコード 3 は除外されると思います。これは事実ではないようです。order by
節が節の前に実行されているかのようですwhere
。クエリから句を除外するとorder by
、クエリが実行されます。
どうしてこれなの?