gpt4 book ai didi

SQL 存储过程将参数传递给 "order by"

转载 作者:行者123 更新时间:2023-12-04 17:53:17 25 4
gpt4 key购买 nike

使用 Microsoft SQL 服务器管理器 2008。

制作一个“最终”选择 Pareto 列表中的前 10 个的存储过程。但我也想再次运行它以找到底部 10。

现在,我不是再次复制查询,而是尝试查看是否有办法将参数传递到查询中,从而将顺序从 asc 更改为 desc。

有什么方法可以避免我复制代码?

CREATE PROCEDURE [dbo].[TopVRM]
@orderby varchar(255)
AS
SELECT Peroid1.Pareto FROM dbo.Peroid1
GROUP by Pareto ORDER by Pareto @orderby

最佳答案

只是有点傻:

CREATE PROCEDURE [dbo].[TopVRM]
@orderby varchar(255)
AS
SELECT Peroid1.Pareto FROM dbo.Peroid1
GROUP by Pareto
ORDER by CASE WHEN @orderby='ASC' THEN Pareto END,
CASE WHEN @orderby='DESC' THEN Pareto END DESC

您并不严格需要将第二个排序条件放在 CASE 中。完全表达式(*),如果 Pareto是数字,你可以决定只做 CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto
(*) 第二个排序条件只有在第一个排序条件认为两行相等时才有效。这要么是因为两行具有相同的帕累托值(因此反向排序也会认为它们相等),要么是因为第一个 CASE表达式正在返回 NULL s (所以 @orderby 不是 'ASC' ,所以我们要执行 DESC 排序。

您可能还想考虑一次性检索两个结果集,而不是进行两次调用:
CREATE PROCEDURE [dbo].[TopVRM]
@orderby varchar(255)
AS

SELECT * FROM (
SELECT
*,
ROW_NUMBER() OVER (ORDER BY Pareto) as rn1,
ROW_NUMBER() OVER (ORDER BY Pareto DESC) as rn2
FROM (
SELECT Peroid1.Pareto
FROM dbo.Peroid1
GROUP by Pareto
) t
) t2
WHERE rn1 between 1 and 10 or rn2 between 1 and 10
ORDER BY rn1

这将为您提供前 10 名和后 10 名,按从上到下的顺序。但是,如果结果总数少于 20 个,则不会出现重复项,这与您当前的计划不同。

关于SQL 存储过程将参数传递给 "order by",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12407247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com