根据列中的值按列动态排序

Posted

技术标签:

【中文标题】根据列中的值按列动态排序【英文标题】:Dynamic sorting by column depending on value in column 【发布时间】:2021-12-06 06:48:53 【问题描述】:

简单明了:是否可以通过系统创建动态排序,根据列内的值,查询会查询。

查询是这样的:

SELECT id, name, sortbycolumn FROM table
WHERE id = :in_id
UNION
SELECT id, name, null sortbycolumn FROM table
WHERE id = :in_id
ORDER BY -- This part I simply don't know how to write. I have tried case and decode...

【问题讨论】:

为此您需要动态 SQL,这意味着您必须编写一个脚本,该脚本本身会编写 SQL 查询和 ORDER BY 子句。 你看到this、this、this和this了吗? 如果您发布了示例数据来说明您的要求,那么有人可能会提供更好的帮助。可能吗?谁知道。按照你的说法,我理解为order by sortbycolumn,这很可能不是你的意思。 请edit 问题包括:CREATE TABLE 为您的表声明;一些样本数据的INSERT 语句;该样本数据的预期输出;问题的英文(不是代码)描述。你说“这部分我根本不知道怎么写”,但你没有解释你有什么数据或你期望什么输出,所以目前无法回答。 【参考方案1】:

回答。我终于找到了解决方案。这很简单,当我阅读其他答案时,我很困惑为什么它对我不起作用。显然,在使用 case when 时,列的索引将不起作用。

最后,我将带有联合的整个查询放入一个子查询中,解决方案是:

SELECT * FROM(
  SELECT id, name, sortbycolumn FROM table
  WHERE id = :in_id
  UNION
  SELECT id, name, null sortbycolumn FROM table
  WHERE id = :in_id
)
ORDER BY
    case when sortbycolumn = 1 THEN id,
    case when sortbycolumn = 2 then name
    else id end

【讨论】:

这是我想到的,但请注意表中的每一行(或您的情况下的联合子组)都有自己的排序列,因此您最终看到的内容可能看起来完全混合。还要注意类型必须匹配。所以这可能必须是case when sortbycolumn = 1 then to_char(id) when sortbycolumn = 2 then name else to_char(id) end 顺便问一下,你是不是故意使用UNION [DISTINCT]。大多数情况下,您只需要UNION ALL。顺便说一下,不需要子查询。所有UNION 部分末尾的ORDER BY 会影响整个结果。 在我的情况下应该是联合。在联合之后 order by 也对我不起作用,这就是为什么我将它全部包装为子查询并且在那之后它起作用了......魔术。

以上是关于根据列中的值按列动态排序的主要内容,如果未能解决你的问题,请参考以下文章

SUM 值按列分组,但不能“聚合”?

按列对 csv 文件进行排序

根据一列中的值对数据表行重新排序

根据父项中的值按 Id 查找子文档

根据Java中的值对地图进行排序的最简单方法是啥?

R:根据上/下行中的值按组识别行