[ad_1]
Teniendo un momento denso/senior hoy…
Tengo una consulta SQL (heredada) ejecutándose en un cte que ahora produce filas numeradas del 1 al 16384. Espero que genere letras de columna en el rango “A” a “XFC” (anteriormente generaba “A” a “ZZ “)
Esto debería funcionar
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;
De hecho, hace funciona – HASTA que lleguemos a la fila 6787 – en lugar de devolver “JAA”, vuelve a “IAA” (hasta “IAZ” y desde allí hace algunas cosas extrañas y maravillosas (incluidos caracteres que no son ASCII))
Puedo solucionarlo con
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;
Lo cual funciona hasta “XFC”.
Lo que no entiendo es… ¿por qué?
Estoy luchando por comprender el significado de 6786 como número clave, aunque me sobreexcité cuando me di cuenta de que es 26 x 255, pero l
¿Es un bigint tan irrelevante?
Lo que he probado:
Código completo para reproducir el comportamiento.
;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;
Solución 1
¡Porque tus cálculos están mal! 😀
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]
コメント