【问题标题】: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 子句。
  • 你看到thisthisthisthis了吗?
  • 如果您发布了示例数据来说明您的要求,那么有人可能会提供更好的帮助。可能吗?谁知道。按照你的说法,我理解为order by sortbycolumn,这很可能不是你的意思。
  • edit 问题包括:CREATE TABLE 为您的表声明;一些样本数据的INSERT 语句;该样本数据的预期输出;问题的英文(不是代码)描述。你说“这部分我根本不知道怎么写”,但你没有解释你有什么数据或你期望什么输出,所以目前无法回答。

标签: sql oracle oracle11g oracle12c


【解决方案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 也对我不起作用,这就是为什么我将它全部包装为子查询并且在那之后它起作用了......魔术。
猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多