[ad_1]
今天有一个密集/高级的时刻……
我有一个(继承的)针对 cte 运行的 SQL 查询,现在生成编号从 1 到 16384 的行。我期望它生成范围为“A”到“XFC”的列字母(之前生成的“A”到“ZZ”) ”)
这应该有效
SQL
SELECT l, CASE WHEN l >= 703 THEN Char(65 + (l - 703) / 702 % 702) ELSE '' END + CASE WHEN l >=27 then Char(65 + (l - 27) / 26 % 26) ELSE '' END + Char(65 + (l - 1) % 26) FROM eFinal WHERE l < 16384 ORDER BY l;
事实上,它 做 工作 – 直到我们到达第 6787 行 – 它不再返回“JAA”,而是恢复为“IAA”(直到“IAZ”,然后从那里做了一些奇怪而奇妙的事情(包括非 ASCII 字符))
我可以绕过它
SQL
SELECT l, (CASE WHEN l >= 6787 THEN Char((65 + (l - 703) / 702 % 702) + 1) WHEN l >= 703 THEN Char(65 + (l - 703) / 702 % 702) ELSE '' END) + (CASE WHEN l > 27 THEN (Char(65 + (l - 27) / 26 % 26)) ELSE '' END) +(Char(65 + (l - 1) % 26)) FROM eFinal WHERE l < 16384 ORDER BY l;
一直到“XFC”。
我不明白的是…为什么?
我正在努力理解 6786 作为一个关键数字的重要性 – 尽管当我意识到它是 26 x 255 时我确实变得过度兴奋但是 l
bigint 是不相关的吗?
我尝试过的:
重现行为的完整代码
SQL
;with cte1 AS (select n from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1) ) AS X(n)) ,cte2 AS (SELECT a.n FROM cte1 a CROSS JOIN cte1 b) -- 10*10 ,cte3 AS (SELECT a.n FROM cte1 a CROSS JOIN cte2 b) -- 10*100 ,cte4 AS (SELECT a.n FROM cte2 a CROSS JOIN cte3 b ) -- 1000*100 ,eFinal AS (SELECT l = ROW_NUMBER() OVER (ORDER BY a.n) FROM cte2 a CROSS JOIN cte3 b ) SELECT l, CASE WHEN l >= 703 THEN Char(65 + (l - 703) / 702 % 702) ELSE '' END + CASE WHEN l >=27 then Char(65 + (l - 27) / 26 % 26) ELSE '' END + Char(65 + (l - 1) % 26) FROM eFinal --WHERE l < 16384 where l BETWEEN 6780 AND 6790 ORDER BY l;
解决方案1
因为你的数学错了! :D
SQL
DECLARE @cnt INT = 6785; WHILE @cnt < 6789 BEGIN SELECT @cnt , (@cnt - 27) / (26 * 26) , CASE WHEN (@cnt - 27 / (26 * 26)) > 0 THEN CHAR(65 + ((@cnt - 27) / (26 * 26))) ELSE '' END , Char(65 + (@cnt - 27) / 26 % 26) , Char(65 + (@cnt - 1) % 26) SET @cnt = @cnt + 1; END
[ad_2]
コメント