Обсуждение: PostgreSQL bug in SELECT DISTINCT
When I execute the following query: SELECT DISTINCT title FROM division ORDER BY UPPER(title); I get: ERROR: For SELECT DISTINCT, ORDER BY expressions must appear in target list If I remove DISTINCT, the query works fine. Is this illegal or a known bug? thanks for any help, J.R. PostgreSQL 7.1 Mandrake 8.0
"J.R. Onyschak" <jonyschak@nvisia.com> writes:
> When I execute the following query:
> SELECT DISTINCT title FROM division ORDER BY UPPER(title);
> I get:
> ERROR: For SELECT DISTINCT, ORDER BY expressions must appear in target list
> If I remove DISTINCT, the query works fine.
> Is this illegal or a known bug?
This is not a bug, but an intentional restriction to prevent ill-defined
query results. Why don't you just "ORDER BY title"?
regards, tom lane
> When I execute the following query:
> SELECT DISTINCT title FROM division ORDER BY UPPER(title);
> I get:
> ERROR: For SELECT DISTINCT, ORDER BY expressions must appear in target list
> If I remove DISTINCT, the query works fine.
> Is this illegal or a known bug?
Illegal. I believe that allowing any function call in the "order by"
clause is an extension to SQL9x, so feel lucky that you can do it at all
;)
However,
SELECT T FROM (SELECT DISTINCT title FROM division) AS T ORDER BY
UPPER(T);
seems to work in 7.1 (but not in earlier releases). This give PostgreSQL
a chance to hold an intermediate result to sort in a second pass.
- Thomas
Tom Lane wrote: >"J.R. Onyschak" <jonyschak@nvisia.com> writes: > >>When I execute the following query: >>SELECT DISTINCT title FROM division ORDER BY UPPER(title); >> >>I get: >>ERROR: For SELECT DISTINCT, ORDER BY expressions must appear in target list >> >>If I remove DISTINCT, the query works fine. >> >>Is this illegal or a known bug? >> > >This is not a bug, but an intentional restriction to prevent ill-defined >query results. Why don't you just "ORDER BY title"? > > regards, tom lane > I can't/don't want to "ORDER BY title" because the title might be entered as upper case or lower case. If we had divisions with titles Transportation, parks, and Education. I would like to display the results alphabetical regardless of capitalization. I know this example is a little contrived because all divisions should be capitalized, but we have a number of "objects" backed by tables that have a title column that we order by and some of them have a high chance of having mixed capitalization. I can understand the prevention of ill-defined query results, but is PostgreSql being too restrictive? I am ordering by a column in the select clause, I am just using a function on that column. Thanks for the great product. It truely has been fun using PostgreSql.Very robust, very easy to use. Thank you for your help, jr P.S. I don't mean for this to sound whiny, but I encounterd this in porting a project from using Oracle to PostgreSql, so I know that Oracle supports it and other people might run into this problem. P.P.S. Where can I locate a copy of the latest SQL spec?
Thomas Lockhart wrote: >>When I execute the following query: >>SELECT DISTINCT title FROM division ORDER BY UPPER(title); >>I get: >>ERROR: For SELECT DISTINCT, ORDER BY expressions must appear in target list >>If I remove DISTINCT, the query works fine. >>Is this illegal or a known bug? >> > >Illegal. I believe that allowing any function call in the "order by" >clause is an extension to SQL9x, so feel lucky that you can do it at all >;) > Where can I look at a copy of the SQL spec? I've tried to locate it online, but haven't been able to find it. > > >However, > >SELECT T FROM (SELECT DISTINCT title FROM division) AS T ORDER BY >UPPER(T); > >seems to work in 7.1 (but not in earlier releases). This give PostgreSQL >a chance to hold an intermediate result to sort in a second pass. > > - Thomas > That's interesting. I remember that, but I don't think I should rely on it because I am trying to keep our SQL code portable across databases. (We've already made once change and might have to do another) Thanks for your time, J.R.