T-SQL如何对文本数据求和?

时间:2019-07-12 13:11:19

标签: sql-server tsql sql-server-2012

我得到了一个字段值0+6+6+6+0+0+0,数据类型是varchar。我怎么能得到它的总和。

我尝试将其转换为int,但出现错误。

select cast('0+6+6+6+0+0+0' as int)

我希望输出为18

6 个答案:

答案 0 :(得分:4)

假设您要对表中的每个记录执行计算。

示例

displayedColumns

返回

displayedColumns = ['address', 'bank_id', 'name', 'city', 'district'];

答案 1 :(得分:3)

正如John所言,动态sql将执行此操作:

declare @x varchar(20) = '0+6+6+6+0+0+0';
exec ('select ' + @x + ' as answer');

但是我想您可能过于简化了。也许更大的问题是,为什么在字符串中有一个需要使用tsql计算的公式。

答案 2 :(得分:3)

如果您使用的是SQL Server 2016及更高版本,则可以使用以下

        DECLARE @NumbersString VARCHAR(1000) = '0+6+6+6+0+0+0'

        SELECT  SUM(cast(value as int)) 
        FROM    string_split(@NumbersString,'+') 

如果您使用的是2016年以下的MS Sql版本

        DECLARE @NumbersString VARCHAR(MAX) = '0+6+6+6+0+0+0'

        SELECT SUM(cast(Split.a.value('.', 'NVARCHAR(MAX)') as int)) DATA
        FROM
        (
            SELECT CAST('<X>'+REPLACE(@NumbersString, '+', '</X><X>')+'</X>' AS XML) AS String
        ) AS A
        CROSS APPLY String.nodes('/X') AS Split(a);

答案 3 :(得分:2)

如果反复发生此类事件,则可以创建一个函数,该函数将从定界文本中拆分数字。然后,您可以应用SUM将列强制转换为整数。它是这样工作的:

CREATE FUNCTION [dbo].[splittext] 
   (@delimiter VARCHAR(5), 
      @text      VARCHAR(MAX)
   ) 
   RETURNS @values table
      (Id   SMALLINT IDENTITY(1,1), 
       delimitedvalue VARCHAR(MAX) 
      ) 
AS 
   BEGIN

      DECLARE @len INT

      WHILE LEN(@text) > 0 
         BEGIN 

            SELECT @len = (CASE CHARINDEX(@delimiter, @text) WHEN 0 THEN LEN(@text) 
            ELSE (CHARINDEX(@delimiter, @text) -1)END) 

            INSERT INTO @values 
            SELECT SUBSTRING(@text, 1, @len )

            SELECT @text = (CASE (LEN( @text )- @len) WHEN 0 THEN '' ELSE RIGHT(@text, LEN(@text) - @len - 1) END) 
         END

      RETURN 

   END

然后获取总和:

SELECT  SUM(CAST(delimitedvalue AS INT)) FROM dbo.[splittext] ('+', '0+6+6+6+0+0+0') 

答案 4 :(得分:2)

只需输入以下代码:

 SELECT SUM(CAST(VALUE AS INT)) FROM STRING_SPLIT('0+6+6+6+0+0+0','+')

答案 5 :(得分:1)

这个答案不可重用,但是通过提供可重用的解决方案,我认为我会鼓励不良数据。

这将立即执行您想要的操作。

const App = ({ setFieldValue }) => {
      let timeout;
      const [text, setText] = useState("");

      const onChange = text => {
        if (timeout) clearTimeout(timeout);
        timeout = setTimeout(() => {
          setText(text);
          //changing value in container
          setFieldValue("textField", text);
        }, 750);
      };

      return (
        <Form>
          <Field
            type="text"
            name="textField"
            placeholder="Type something..."
            onChange={e => {
              onChange(e.target.value);
            }}
            style={{ width: "100%" }}
          />
          <br />
          <br />
          <div>output: {text}</div>
        </Form>
      );
    };

您的数字不大,您可以轻松地将三个数字进行转换并将其相加。理想情况下,一列中不应存在诸如DECLARE @fullString VARCHAR (20) = '0+6+6+6+0+0+0' DECLARE @firstNo INT = CAST(SUBSTRING(@fullString,3,1) AS INT) DECLARE @secondNo INT = CAST(SUBSTRING(@fullString,5,1) AS INT) DECLARE @thirdNo INT = CAST(SUBSTRING(@fullString,7,1) AS INT) SELECT @firstNo + @secondNo + @thirdNo AS 'Total' 之类的值。从您想做的事情来看,我认为每个数字代表不同的东西,因此每个数字都应这样存储。我将专注于解决实际问题并修复数据。即使您现在就找到一种处理这些数据的方法,迟早也会用脚开枪。