sql - ORDER BY 在使用 Case When 运行查询时出错

标签 sql

我有这个查询:

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

我的表格是这样的:

表1

    id | title
    ---+------
     1 | aaaaa
     2 | bbbb
     3 | ccc
     4 | ddddd

表2

    id | mediaId
    ---+---------
     1 |    2
     2 |    2
     3 |    4
     4 |    1

当我运行此查询时,出现此错误:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

这段代码有什么问题?

如果我删除Else,它就可以正常工作

最佳答案

case 表达式返回具有单一类型的单个值。您正在混合类型,因此会出现错误。 SQL 规则规定在这种情况下字符串会转换为数字——这就是错误发生的地方。

简单的解决方案是两个表达式:

1 = 1 相当神秘。这通常是这样的:

order by (case when @var = 1 then a.title end),
         (case when @var = 2 then null else a.id end)

您可以通过显式转换来消除错误:

order by (case when 1 = 1 then a.title end),
               else cast(a.id as varchar(255)
          end)

但是,对于第二种情况,这不会对数据进行数字排序。

关于sql - ORDER BY 在使用 Case When 运行查询时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60464071/

相关文章:

sql - 多线程处理数据库记录的最佳实践

android - SqlLiteDatabase.query 按日期排序的列不起作用

sql - WHERE 子句中的 CASE

php - 如何查询外键并获取对应的行

java - 注解@Id和@GenerateValue(strategy = GenerationType.IDENTITY)有什么用?为什么世代类型是身份?

SQL Server - 选择所有顶部的小时记录

php - 使用 php 优化 SQL 查询

sql - 将发票存储在数据库中

php - codeigniter result_array 无法在真实服务器上运行

sql - 防止Sql列溢出