在SQL的数字的每一位数中添加一些特定值

时间:2018-10-30 08:31:47

标签: sql-server tsql

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

(1)在特定数字的每个数字中加3

(2)如果我们将10、11、12等两位数字相加后得到结果,则仅考虑最后一位数字

例如,如果数字为564843530,则enter code here 新数字将是897176023。

4 个答案:

答案 0 :(得分:2)

解决方案:

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 SUM((((Number % 10) + 3) % 10) * POWER(10, Power10)) AS NewNumber
FROM DigitsTable
OPTION (MAXRECURSION 0);

输出:

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

答案 1 :(得分:1)

为此:

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)');

算法很简单:

  1. 将字符串拆分为chars(以您的情况为数字)
  2. 为每个数字加3
  3. 使用RIGHT只能获取第一个正确的字符
  4. 连接数字

这应该在旧版本上有效。如果您使用的是SQL Server 2016,则可以使用STRING_SPLIT中的STRING_AGGSQL Server 2017之类的功能。

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

enter image description here

如果对SQL CLR感兴趣,请检查以下link

答案 2 :(得分:0)

假设OP提供的示例值是错误的(如我的评论564843530不会变成8971768635 + 3 = (1)0和{{ 1}}?” ),那么这就是我的方法,该方法使用了NGrams8k

3 + 3 = 2

答案 3 :(得分:0)

尝试一下

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