如何选择以下字符串以使其返回3? SELECT' 1 + 2'

时间:2017-07-03 15:22:43

标签: sql sql-server sql-server-2016

在一个专栏" 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主要是针对一个函数的创建,我只想从表格中选择一个简单的脚本

6 个答案:

答案 0 :(得分:12)

这是使用--- sql

的一种方法
dynamic

答案 1 :(得分:3)

这里不容易......您可以使用动态创建的语句:

Prdp的答案很棒,只是对SQL注入的补充

您可以使用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 |
+------------+--------+

有许多方法可以分割字符串,这个基本前提可以与其中任何一个一起使用。

拆分字符串参考:

答案 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