根据列中的值按列动态排序
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 也对我不起作用,这就是为什么我将它全部包装为子查询并且在那之后它起作用了......魔术。以上是关于根据列中的值按列动态排序的主要内容,如果未能解决你的问题,请参考以下文章