gpt4 book ai didi

sql - 复杂的 SQL while 循环

转载 作者:行者123 更新时间:2023-12-01 09:54:01 25 4
gpt4 key购买 nike

我正在尝试在 SQL 中创建一个 while 循环,它看起来有点复杂。这是我需要它实现的目标:

  1. 遍历单个 VARCHAR 字符串(例如“123”)
  2. 如果第 n 个字符在字符串中的偶数位置(例如字符串中的第 2、4 .... 个字母),则必须将其添加 (SUM) 到基变量(假设 @z)<
  3. 如果第 n 个字符在字符串中处于奇数位置(例如字符串中的第 1、3... 字母),则必须将其乘以 2。如果这个新生成的值(假设 @y)是小于 10,则必须将其添加 (SUM) 到基本变量(仍与假设的@z 相同)。如果@y 大于 10,我们需要先从 @y 中减去 9,然后再将它加(SUM)到 @z

遍历整个字符串后,这应该会返回一个由上述过程生成的数值。

这是我到目前为止所做的,但我现在被卡住了(不用说,这段代码还不能工作,但我认为我正朝着正确的方向前进):

DECLARE @x varchar(20) = '12345'
DECLARE @p int = len(@x)

WHILE @p > 0
SELECT @x =
stuff(@x, @p, 1,
case when CONVERT(INT,substring(@x, @p, 1)) % 2 = 0 then CONVERT(INT, @x) + CONVERT(INT,substring(@x, @p, 1))
end), @p -= 1

RETURN @x;

附言。输入将始终是 100% 的数值,但当我收到它时它被格式化为 VARCHAR。

更新

示例字符串的预期结果是 15

最佳答案

您可以在不使用循环的情况下执行此操作。下面是一个使用 Tally Table 的解决方案:

DECLARE @x VARCHAR(20) = '12345'
DECLARE @z INT = 0 -- base value

;WITH E1(N) AS( -- 10 ^ 1 = 10 rows
SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
CteTally(N) AS(
SELECT TOP(LEN(@x)) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
FROM E4
),
CteChars(N, num) AS(
SELECT
t.N, CAST(SUBSTRING(@x, t.N, 1) AS INT)
FROM CteTally t
WHERE t.N <= LEN(@x)
)
SELECT
SUM(
CASE
WHEN N % 2 = 0 THEN num
WHEN num * 2 < 10 THEN num * 2
ELSE (num * 2) - 9
END
) + @z
FROM CteChars

CTE 直到 CteTally 生成一个从 1 到 LEN(@x) 的数字列表。 CteChars@x 逐个字符分成单独的行。然后最后的 SELECT 根据条件执行 SUM

OUTPUT : 15

关于sql - 复杂的 SQL while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32374292/

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