يؤدي إنشاء تسلسل إلى تغيير السلوك في رقم صف محدد


وجود لحظة كثيفة / كبار اليوم …

لدي استعلام 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

コメント

タイトルとURLをコピーしました