Sql server 在SQL中的每个数字中添加一些特定值

Sql server 在SQL中的每个数字中添加一些特定值,sql-server,tsql,Sql Server,Tsql,我需要计算一些数字的公式 1在特定数字的每一位加上3 < p>2,如果在加法中得到结果,如10、11、12等两个数字,则只考虑最后一个数字 例如,如果数字为564843530,则在此处输入代码 新号码为897176023。 SELECT ( SELECT RIGHT(SUBSTRING(DS.[number], v.[number] + 1, 1) + 3, 1) FROM ( SELECT '564843530' ) DS ([number]

我需要计算一些数字的公式

1在特定数字的每一位加上3

< p>2,如果在加法中得到结果,如10、11、12等两个数字,则只考虑最后一个数字

例如,如果数字为564843530,则在此处输入代码 新号码为897176023。

SELECT
(
    SELECT RIGHT(SUBSTRING(DS.[number], v.[number] + 1, 1) + 3, 1)
    FROM 
    (
        SELECT '564843530' 
    ) DS ([number])
    INNER JOIN [master]..spt_values v on v.[number] < LEN(DS.[number])
    WHERE V.[type] = 'P'
    ORDER BY v.[number] 
    FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)');
算法很简单:

将字符串拆分为案例编号中的字符 每个数字加3 使用RIGHT仅获取第一个正确的字符 连接数字 这应该适用于旧版本。如果您使用的是SQL Server 2016,则可以在SQL Server 2017中使用诸如STRING_SPLIT和STRING_AGG之类的函数

对于旧版本,您可以查找SQL CLR函数,以便编写自己的函数进行拆分和连接。例如,在我的系统中,我可以执行以下操作:

如果对SQL CLR感兴趣,请检查以下内容。

SELECT
(
    SELECT RIGHT(SUBSTRING(DS.[number], v.[number] + 1, 1) + 3, 1)
    FROM 
    (
        SELECT '564843530' 
    ) DS ([number])
    INNER JOIN [master]..spt_values v on v.[number] < LEN(DS.[number])
    WHERE V.[type] = 'P'
    ORDER BY v.[number] 
    FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)');
算法很简单:

将字符串拆分为案例编号中的字符 每个数字加3 使用RIGHT仅获取第一个正确的字符 连接数字 这应该适用于旧版本。如果您使用的是SQL Server 2016,则可以在SQL Server 2017中使用诸如STRING_SPLIT和STRING_AGG之类的函数

对于旧版本,您可以查找SQL CLR函数,以便编写自己的函数进行拆分和连接。例如,在我的系统中,我可以执行以下操作:


如果对SQL CLR感兴趣,请检查以下内容。

假设OP提供的示例值是错误的,因为根据我的评论,564843530不应该变成897176863吗?5+3=10是多少?3+3=2?,这是我的方法,它利用了:


假设OP提供的示例值是错误的,根据我的评论,564843530不应该变成897176863吗?5+3=10是多少?3+3=2?,这是我的方法,它利用了:

解决方案:

输出:

897176863
说明:

此答案基于一个递归CTE,该CTE返回每个当前数字、新数字和乘数进行计算:

DECLARE @number int
SET @number = 564843530;

WITH DigitsTable AS 
(
    SELECT 0 AS Power10, ABS(@Number) AS Number
    UNION ALL
    SELECT Power10 + 1, Number / 10
    FROM DigitsTable
    WHERE Number > 10
)
SELECT 
    Power10,
    Number % 10 AS Digit,
    ((Number % 10) + 3) % 10 AS NewDigit,
    POWER(10, Power10) AS Multiplier
FROM DigitsTable
OPTION (MAXRECURSION 0);
递归CTE的输出:

Power10 Digit   NewDigit    Multiplier
0       0       3           1
1       3       6           10
2       5       8           100
3       3       6           1000
4       4       7           10000
5       8       1           100000
6       4       7           1000000
7       6       9           10000000
8       5       8           100000000
解决方案:

输出:

897176863
说明:

此答案基于一个递归CTE,该CTE返回每个当前数字、新数字和乘数进行计算:

DECLARE @number int
SET @number = 564843530;

WITH DigitsTable AS 
(
    SELECT 0 AS Power10, ABS(@Number) AS Number
    UNION ALL
    SELECT Power10 + 1, Number / 10
    FROM DigitsTable
    WHERE Number > 10
)
SELECT 
    Power10,
    Number % 10 AS Digit,
    ((Number % 10) + 3) % 10 AS NewDigit,
    POWER(10, Power10) AS Multiplier
FROM DigitsTable
OPTION (MAXRECURSION 0);
递归CTE的输出:

Power10 Digit   NewDigit    Multiplier
0       0       3           1
1       3       6           10
2       5       8           100
3       3       6           1000
4       4       7           10000
5       8       1           100000
6       4       7           1000000
7       6       9           10000000
8       5       8           100000000
试试这个

DECLARE @n int, @inc int;
SELECT @n = 564843530, @inc = 3;
WITH t1(n, m, k, p)
AS (
   SELECT @n AS n, CAST(0 AS int) AS m, CAST(0 AS int) AS k, CAST(0 AS bigint) AS p
   UNION ALL
   SELECT n / 10 AS n, n - round(n, -1, 1) AS m,  k + 1 AS k, CAST(power(10, k) AS bigint) AS p
   FROM t1 WHERE n > 0
)
SELECT SUM((CASE WHEN m > 10 - @inc THEN m - 10 + @inc ELSE m + @inc END) * p)
FROM t1
结果

897176863
试试这个

DECLARE @n int, @inc int;
SELECT @n = 564843530, @inc = 3;
WITH t1(n, m, k, p)
AS (
   SELECT @n AS n, CAST(0 AS int) AS m, CAST(0 AS int) AS k, CAST(0 AS bigint) AS p
   UNION ALL
   SELECT n / 10 AS n, n - round(n, -1, 1) AS m,  k + 1 AS k, CAST(power(10, k) AS bigint) AS p
   FROM t1 WHERE n > 0
)
SELECT SUM((CASE WHEN m > 10 - @inc THEN m - 10 + @inc ELSE m + @inc END) * p)
FROM t1
结果

897176863

你试过什么吗?如果是,请告诉我们564843530不应该变成897176863吗?5+3=10是多少?3+3=2?你试过什么吗?如果是,请告诉我们564843530不应该变成897176863吗?5+3=10是多少?3+3=2?图片和截图可以很好地添加到帖子中,但请确保没有它们的帖子仍然清晰有用。如果您发布代码或错误消息的图像,请确保您也将实际代码/消息复制粘贴或直接键入到帖子中。@Rob解决方案作为T-SQL代码存在,可以复制。另一个声明仅适用于我的环境-屏幕截图显示概念和工作证明。请先阅读答案,并在理解的情况下标记出来。@gotqn简单答案获得预期结果,这个答案给我留下了深刻的印象,兄弟,我正在为这个问题编写脚本,并附加了一些步骤,但我不想通过看到你的答案来发布。@Sreenu131谢谢。别担心,如果还没有发布,那么提供另一个解决方案并没有什么错。图片和截图可以很好地添加到帖子中,但请确保没有它们的帖子仍然清晰有用。如果您发布代码或错误消息的图像,请确保您也将实际代码/消息复制粘贴或直接键入到帖子中。@Rob解决方案作为T-SQL代码存在,可以复制。另一个声明仅适用于我的环境-屏幕截图显示概念和工作证明。请先阅读答案,并在理解的情况下标记出来。@gotqn简单答案获得预期结果,这个答案给我留下了深刻的印象,兄弟,我正在为这个问题编写脚本,并附加了一些步骤,但我不想通过看到你的答案来发布。@Sreenu131谢谢。别担心,如果还没有发布,那么提供另一个解决方案并没有什么错。