SQL Сумма чисел из строки - PullRequest
       14

SQL Сумма чисел из строки

0 голосов
/ 25 сентября 2018

У меня есть такая строка:)

"<"FOSTIMON 75 M.J.>|4|4|4|3|3|3|3|3|3|3|3|3||||||||||||||||||||||||||||"

Мне нужна сумма чисел (4 + 4 + 4 + 3 + ... + 3), ожидаемаярезультат = 39

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Попробуйте это

Предполагая, что первая часть строки до первой "|"можно игнорировать. Не уверен, какую версию SQL вы используете, но если он меньше, чем SQL2016, используйте этот разделитель строк

DECLARE @s NVARCHAR(50) = '<"FOSTIMON 75 M.J.>|4|4|4|3|3|3|3|3|3|3|3|3||||||||||||||||||||||||||||'

SELECT 
     SUM(CONVERT(INT, S.[Value]))
FROM dbo.DelimitedSplit8K(@s, '|') S
WHERE S.RN >= 2 AND S.RN <= 13

Если вы используете SQL2012 +, вы можете использовать TRY_PARSE и вообще избавьтесь от предложения WHERE

SELECT 
     SUM(   
            CASE
                WHEN TRY_PARSE(S.[Value] AS INT) IS NOT NULL
                THEN CONVERT(INT, S.[Value])
                ELSE 0
            END
            --CONVERT(INT, S.[Value])
        )
FROM dbo.DelimitedSplit8K(@s, '|') S

Если вы используете SQL2016 +, тогда используйте встроенную функцию String_Split

SELECT 
        SUM(    
            CASE
                WHEN TRY_PARSE(S.[Value] AS INT) IS NOT NULL
                THEN CONVERT(INT, S.[Value])
                ELSE 0
            END
        )
FROM STRING_SPLIT(@s, '|') S
0 голосов
/ 25 сентября 2018

ЭТО ОТВЕТИТ НА ОРИГИНАЛЬНЫЙ ВОПРОС ПЕРЕД РЕДАКТИРОВАНИЕМ.

Большинство баз данных поддерживают выполнение той или иной формы подготовленного оператора.В вашем случае, возможно, самый простой способ - это создать оператор SQL и затем выполнить его динамически.

Синтаксис для этого значительно варьируется от базы данных к базе данных.Случайно я выбираю SQL Server, но функциональность (хотя и не синтаксис) доступна практически в любой базе данных:

declare @str nvarchar(max) = '|4|4|4|3|3|3|3|3|3|3|3|3||||||||||||||||||||||||||||';

set @str = 'select ' + replace(@str, '|', '+') + ' + 0';

exec sp_executesql @str;

Здесь - реекстер для этой конкретной версии.

Обратите внимание, что это работает, поскольку + является унарным (числовым) оператором, аналогичным -, но не меняет знак.

...