I have this query:
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.