我得到了一个字段值0+6+6+6+0+0+0
,数据类型是varchar。我怎么能得到它的总和。
我尝试将其转换为int,但出现错误。
select cast('0+6+6+6+0+0+0' as int)
我希望输出为18
。
答案 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'
之类的值。从您想做的事情来看,我认为每个数字代表不同的东西,因此每个数字都应这样存储。我将专注于解决实际问题并修复数据。即使您现在就找到一种处理这些数据的方法,迟早也会用脚开枪。