【问题标题】:hql CASE WHEN not able to use multiple timehql CASE WHEN 不能多次使用
【发布时间】:2021-10-30 15:25:08
【问题描述】:

我需要在 hql 查询中为 order by 设置条件。

  1. sortBy(列名)
  2. sortOrder(升序或降序)

在我的 hql 查询中有 3 个表加入

select a from TableA a, TableB b, TableC c WHERE a.column1 = b.column2 AND b.column1 = c.column2 ORDER BY CASE WHEN :sortBy = column3 THEN a.column3 WHEN :sortBy = column4 THEN b.column4 ELSE c.column5 END CASE WHEN :sortOrder = 'asc' THEN asc ELSE desc END

在这个查询中,第二个CASE WHEN 条件出现错误

我也尝试过下面的查询

select a from TableA a, TableB b, TableC c WHERE a.column1 = b.column2 AND b.column1 = c.column2 ORDER BY CASE WHEN :sortBy = column3 THEN (CASE WHEN :sortOrder = 'asc' THEN 'a.column3 asc' ELSE 'a.column3 desc' END) WHEN :sortBy = column4 THEN (CASE WHEN :sortOrder = 'asc' THEN 'b.column4 asc' ELSE 'b.column4 desc' END) ELSE (CASE WHEN :sortOrder = 'asc' THEN 'c.column5 asc' ELSE 'c.column5 desc' END) END

在这个查询中,响应没有排序

你能指导我这个查询有什么问题吗?

【问题讨论】:

  • CASE 子句中的 CASE 表达式需要用逗号分隔。这是一个错字问题。
  • @TimBiegeleisen 不需要在ORDER BY中加逗号
  • 您确实需要在两个CASE 表达式之间使用逗号,但实际上我认为需要重写逻辑顺序。
  • 如果您不添加示例数据,这里的任何人都不太可能为您提供帮助。

标签: mysql spring hql


【解决方案1】:

ORDER BY 子句中的CASE 表达式需要用逗号分隔。但是,您似乎希望能够根据参数:sortOrder 选择排序方向。一种方法是与CASE 表达式相乘,该表达式生成1.0 用于升序,-1.0 用于降序。

SELECT a from TableA a, TableB b, TableC c
WHERE a.column1 = b.column2 AND b.column1 = c.column2
ORDER BY
    (CASE WHEN :sortOrder = 'asc' THEN 1.0 ELSE -1.0 END) *
    CASE WHEN :sortBy = column3 THEN a.column3
         WHEN :sortBy = column4 THEN b.column4
         ELSE c.column5 END;

【讨论】:

  • @AkashChavda 第 3、4 和 5 列的类型是什么?请在上面的问题中包含这些信息以及一些示例数据。
  • column5 是双精度,另外两个是字符串数据类型。关于表格和数据太长
  • 你不能那样做。 CASE 表达式的所有 分支必须具有相同的类型。即使它可以编译和运行,你得到的行为也可能不是你想要的。尝试在此处向您的问题添加一些示例数据以获得最佳结果。
  • 是的,case 表达式比较值是字符串,但在 THEN 条件下,列类型不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多