在一个专栏" SumStrings"我有一些表格,例如' 1 + 2'或者' 1 + 2-3'像这样:
SumStrings
1+2
1+2-3
换句话说:
DROP TABLE IF EXISTS #theSums;
CREATE TABLE #theSums (SumStrings VARCHAR(25))
INSERT INTO #theSums
values
('1+2'),
('1+2-3');
如何从此表中选择以获得这些总和的结果?即,如果表中只有上述两个字符串,则选择结果应为3和0
这个问题String Expression to be evaluated to number主要是针对一个函数的创建,我只想从表格中选择一个简单的脚本
答案 0 :(得分:12)
这是使用---
sql
dynamic
答案 1 :(得分:3)
这里不容易......您可以使用动态创建的语句:
您可以使用XML的隐式功能来计算 - 这是反向提取! - 文字值。无法绕过动态SQL,但这有助于克服疯狂的价值观:
试试这个
SELECT CAST('' AS XML).value('1+2','int') AS Result;
此示例带有CURSOR
,但使用@ Prdp的方法也可以这样做:
CREATE TABLE YourTable(ComputeString VARCHAR(100));
INSERT INTO YourTable VALUES('1+2'),('-2+3'),('3*(4+5)'),('12/4');
DECLARE @cs VARCHAR(100);
DECLARE c CURSOR FOR SELECT 'SELECT CAST('''' AS XML).value(''' + REPLACE(ComputeString,'/',' div ') + ''',''int'') AS Result;' FROM YourTable
OPEN c;
FETCH NEXT FROM c INTO @cs;
WHILE @@FETCH_STATUS=0
BEGIN
PRINT @cs
EXEC(@cs);
FETCH NEXT FROM c INTO @cs;
END
CLOSE c;
DEALLOCATE c;
GO
DROP TABLE YourTable;
您必须将/
替换为除数运算符div
答案 2 :(得分:1)
您必须查询字符串并在执行查询的程序中对它们进行评估。这是非常重要的,但有许多用flex + bison(或其他工具)编写的语言示例,如果你真的必须存储表达式而不是它们的值,那么它们可以帮助你评估表达式。
答案 3 :(得分:1)
使用replace()
在+
和-
之前添加分隔符;拆分字符串,sum()
:
在SQL Server 2016+中,您可以使用string_split()
。
select
t.SumStrings
, Summed = sum(convert(int,s.value))
from #theSums t
cross apply string_split(replace(replace(SumStrings,'+','|+'),'-','|-'),'|') s
group by t.SumStrings
返回:
+------------+--------+
| SumStrings | Summed |
+------------+--------+
| 1+2 | 3 |
| 1+2-3 | 0 |
+------------+--------+
dbfiddle.uk演示:http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=abd084c8fe3758c29c26e29a1f9dfa36
在2016年之前的SQL Server中,使用Jeff Moden的CSV Splitter表值函数:
select
t.SumStrings
, Summed = sum(convert(int,s.Item))
from #theSums t
cross apply delimitedsplit8K(replace(replace(SumStrings,'+','|+'),'-','|-'),'|') s
group by t.SumStrings
rextester演示:http://rextester.com/GTGT29482
返回:
+------------+--------+
| SumStrings | Summed |
+------------+--------+
| 1+2 | 3 |
| 1+2-3 | 0 |
+------------+--------+
有许多方法可以分割字符串,这个基本前提可以与其中任何一个一起使用。
拆分字符串参考:
string_split()
in SQL Server 2016 : Follow-Up #1 - Aaron Bertrand string_split()**
- Solomon Rutzky 答案 4 :(得分:1)
另一个动态sql
DECLARE @sql VARCHAR(8000) = ''
SELECT @sql = CONCAT( @sql , ' union all select ', ts.SumStrings)
FROM #theSums ts
SELECT @sql = STUFF(@sql, 1,10,'')
PRINT @sql
EXEC (@sql)
答案 5 :(得分:1)
使用临时表。从sumString中提取字符串公式并使用select执行它,然后将所需的值插入临时表中。这是一行一行。
设置表格 CREATE TABLE sumString( 配方varchar(20) )
CREATE TABLE temp(
result varchar(20)
)
INSERT INTO sumString(formula)
VALUES
('1+3'),
('1+2-3')
解决方案:
DECLARE @expression varchar(20)
WHILE(EXISTS(SELECT 1 FROM sumString))
BEGIN
SELECT TOP(1) @expression = formula
FROM sumString
INSERT INTO temp
--the key is to execute with select as a string so the string formula will be evaluate
exec ('select '+ @exp)
DELETE TOP (1) FROM sumString
END
<强>结果:强>
--check the result--
SELECT * FROM temp
result
4
0