Mis*_*ish 5 sql-server t-sql substring
我面前有一项复杂的任务,我真的可以用你的一些大脑来帮助我。
在我的工作中,我们有一个存储条形码数字的数据库。该表包含 6 位数字作为 8 位条形码的前缀,我们目前是否在 Excel 中手动计算条形码的最后 2 位数字。
以下是我们如何手动计算最后 2 位数字的步骤:
条码前缀示例:
declare @prefix int
set @prefix = 573071
Run Code Online (Sandbox Code Playgroud)
1)每个前缀应生成 10 次,其中第 7 位数字从 0 自动递增到 9
5730710
5730711
5730712
5730713
5730714
5730715
5730716
5730717
5730718
5730719
Run Code Online (Sandbox Code Playgroud)
2)加上第 7 位数字后,我们使用以下公式计算每行的第 8 位数字:
首先我们开始计算第一行((5730710)。然后我们开始计算第一,第三,第五,第七位并乘以3并将它们加在一起
5730710:
5 x 3
3 x 3
7 x 3
0 x 3
Run Code Online (Sandbox Code Playgroud)然后我们取第二、四、六位数字乘以 1 并将它们加在一起:
7 x 1
0 x 1
1 x 1
Run Code Online (Sandbox Code Playgroud)我们使用 SUM (45 + 7 = 53) 将两个结果相加
然后我们将53 向上舍入到最接近的 10(仅向上),在这种情况下它必须是 60
DECLARE @num int = 53;
SELECT @num + (10 - (@num % 10)); = 60
Run Code Online (Sandbox Code Playgroud)在我们向上舍入后,我们用原始值减去向上舍入值:(60 - 53 = 7)
....最后我们从 6 位前缀生成了一个 8 位条形码:结果:57307107
所以我的问题是,我如何通过 sql 做到这一点?
这是我如何计算第 8 位数字:
declare @prefix int
set @prefix = 5730710
Select
(
SUBSTRING(cast(@prefix as varchar), 1,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 3,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 5,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 7,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 2,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 4,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 6,1 )*1
)
+
(10 - ((
SUBSTRING(cast(@prefix as varchar), 1,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 3,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 5,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 7,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 2,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 4,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 6,1 )*1
)%10))
-
(
SUBSTRING(cast(@prefix as varchar), 1,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 3,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 5,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 7,1 )*3
+
SUBSTRING(cast(@prefix as varchar), 2,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 4,1 )*1
+
SUBSTRING(cast(@prefix as varchar), 6,1 )*1
)
Run Code Online (Sandbox Code Playgroud)
但是我仍然缺少如何自动生成从 0 到 9 的第 7 位数字并将其放入上述公式中,最后一旦计算出第 7 位和第 8 位数字,我需要将它们添加到前缀中以最终查看最终结果8 位条码。
DECLARE @prefix INT;
SET @prefix = 573071;
WITH
cte1 AS (SELECT 0 num
UNION ALL
SELECT num+1 FROM cte1 WHERE num < 9)
SELECT num,
@prefix*100+num*10+9-((@prefix/100000+(@prefix/1000)%10+(@prefix/10)%10+num)*3+((@prefix/10000)%10+(@prefix/100)%10+@prefix%10)-1)%10 barcode
FROM cte1;
Run Code Online (Sandbox Code Playgroud)
没有变量声明的选项:
WITH
cte0 AS (SELECT 573071 AS prefix),
cte1 AS (SELECT 0 num
UNION ALL
SELECT num+1 FROM cte1 WHERE num < 9)
SELECT num,
prefix*100+num*10+9-((prefix/100000+(prefix/1000)%10+(prefix/10)%10+num)*3+((prefix/10000)%10+(prefix/100)%10+prefix%10)-1)%10 barcode
FROM cte0, cte1;
Run Code Online (Sandbox Code Playgroud)