I have this query:
x
SELECT DISTINCT *
FROM
(SELECT h.ID, h.Title
FROM table1 h
LEFT JOIN table2 k ON h.ID = k.MediaID) a
ORDER BY
CASE
WHEN 1 = 1 THEN a.Title
ELSE a.ID
END ASC
And my tables are like this:
table1
id | title
---+------
1 | aaaaa
2 | bbbb
3 | ccc
4 | ddddd
table2
id | mediaId
---+---------
1 | 2
2 | 2
3 | 4
4 | 1
When I run this query, I get this error:
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
What’s wrong whit this code?
If I remove Else
it works fine
Advertisement
Answer
A case
expression returns a single value, with a single type. You are mixing types and hence getting an error. The rules of SQL says that strings are converted to numbers in this situation — and that is where the error is happening.
The simple solution is two expressions:
1 = 1
is rather arcane. This would normally be something like:
order by (case when @var = 1 then a.title end),
(case when @var = 2 then null else a.id end)
You could get rid of the error with an explicit conversion:
order by (case when 1 = 1 then a.title end),
else cast(a.id as varchar(255)
end)
However, this would not sort the data numerically for the second case.