[ad_1]
وجود لحظة كثيفة / كبار اليوم …
لدي استعلام SQL (موروث) يعمل مقابل cte الذي ينتج الآن صفوفًا مرقمة من 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 × 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
لأن حساباتك خاطئة! :د
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]
コメント