gpt4 book ai didi

sql - IF THEN 在存储过程中循环

转载 作者:行者123 更新时间:2023-12-02 01:43:02 26 4
gpt4 key购买 nike

我尝试在存储过程中使用 IF THEN 循环,如下所示:

@A varchar(100),
@B varchar(100)
AS
BEGIN

IF (@A = 'NULL' AND @B = 'NULL')
BEGIN
SELECT TOP 5 X1, X2, A, B, Y1, Y2, X3
FROM mytable
ORDER BY Y1 DESC
SELECT TOP 5 X1, X2, A, B, Y1, Y2, X3
FROM mytable
ORDER BY Y2 DESC
END

ELSE IF (@A = 'NULL' AND @B IS NOT NULL)
BEGIN
SELECT TOP 5 Y1Rank, X1, X2, A, B, Y1, Y2, X3
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY B ORDER BY Y1 DESC) AS 'Y1Rank'
FROM mytable
WHERE B = @B
) b1

SELECT TOP 5 Y2Rank, X1, X2, A, B, Y1, Y2, X3
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY B ORDER BY Y2 DESC) AS 'Y2Rank'
FROM mytable
WHERE B = @B
) b2
END

ELSE IF (@A IS NOT NULL AND @B = 'NULL')
BEGIN
SELECT TOP 5 Y1Rank, X1, X2, A, B, Y1, Y2, X3
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY A ORDER BY Y1 DESC) AS 'Y1Rank'
FROM mytable
WHERE A = @A
) b3

SELECT TOP 5 Y2Rank, X1, X2, A, B, Y1, Y2, X3
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY A ORDER BY Y2 DESC) AS 'Y2Rank'
FROM mytable
WHERE A = @A
) b4
END
ELSE
BEGIN
SELECT TOP 5 Y1Rank, X1, X2, A, B, Y1, Y2, X3
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY A, B ORDER BY Y1 DESC) AS 'Y1Rank'
FROM mytable
WHERE A = @A AND B = @B
) b5

SELECT TOP 5 Y2Rank, X1, X2, A, B, Y1, Y2, X3
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY A, B ORDER BY Y2 DESC) AS 'Y2Rank'
FROM mytable
WHERE A = @A AND B = @B
) b6
END
END
GO

我的目标是 SP 的工作方式类似于搜索引擎:

  1. 如果用户同时指定 @A 和 @B(例如,@A = alpha,@B = bravo),则会返回以 Y1 表示的前 5 个结果,并以 Y2 表示的前 5 个结果。这些结果在 A = alpha 和 B = bravo 中。
  2. 如果用户仅指定@A(例如,@A = alpha)或@B(@B = bravo)(另一个将输入为“NULL”),则根据Y1和前5个结果返回前5个结果就Y2而言。这些结果仅适用于 A=alpha 和任何 B 或 B=bravo 和任何 A。
  3. 如果用户未指定 A 和 B(两者均输入“NULL”),则返回以 Y1 表示的前 5 个结果,以 Y2 表示的前 5 个结果。这些结果的 A 和 B 可以是任意值。

代码的实际结果是:

  • 如果我同时指定 A 和 B,代码就可以正常工作。
  • 如果我不指定 A 或 B(输入 @A = 'NULL' 和 @B = 'NULL'),代码也可以正常工作。
  • 但是如果我只指定 A 和 B 之一(例如,输入 @A = 'alpha' 和 @B = 'NULL';或者输入 A = 'NULL' 和 B = 'Bravo'),则代码返回 a仅包含标题的空表格。

有人可以帮我解决这个问题吗?非常感谢。

================================================== =============================================顺便说一句,我尝试在查询中使用相同的代码,但没有在存储过程中使用。我试过了

DECLARE @A varchar(100),
@B varchar(100)
SET @A = 'NULL'
SET @B = 'Bravo'

DECLARE @A varchar(100),
@B varchar(100)
SET @A = 'Alpha'
SET @B = 'NULL'

接下来的代码与我在存储过程中使用的代码完全相同,它的工作原理正是我想要的!我认为它们应该是等效的,但不知何故只适用于正常查询,但不适用于存储过程......我真的很困惑。

最佳答案

尝试使用参数的默认值,如下所示:

@A varchar(100) = 'NULL',
@B varchar(100) = 'NULL'

这样,如果用户仅提供一个参数的值,则另一个参数只需使用默认值。

关于sql - IF THEN 在存储过程中循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23044670/

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