SQL:将字符串转换为数学运算符

时间:2016-09-29 11:36:29

标签: sql sql-server

这就是我要做的事情:

select Id, Operator form MathOperator 

结果:

ID | Operator
-----------
1  |  '+' 
2  |  '-'

*并以某种方式执行此操作:

declare @operator char(2)=  
     (select MathOperatorSymbol from MathOperator Where MathOperatorId = 1) 

select 1 @operator  2  -- should be as: select 1+2

有可能吗?

5 个答案:

答案 0 :(得分:2)

使用动态SQL

exec('select 1'+ @operator + ' 2')

答案 1 :(得分:1)

您可以使用动态SQL执行此操作:

<=

当然,>=remote_tmp1在此上下文中不起作用,因此会产生错误。

答案 2 :(得分:1)

是的,它是可靠的。您可以使用动态查询

示例:

BEGIN
DECLARE @STRQUERY NVARCHAR(MAX)
DECLARE @OPERATOR CHAR(2)
 SET @OPERATOR = '+';
 SET @STRQUERY = 'SELECT 1' + @OPERATOR + '2';

 EXEC (@STRQUERY)

END

答案 3 :(得分:0)

如果您只支持简单计算(Num1 Operator Num2),则可以使用case expression选择正确的运算符。

SELECT
    CASE Operator
        WHEN '+' THEN Num1 + Num2
        WHEN '-' THEN Num1 - Num2
        ELSE NULL
    END AS Result
FROM
    MyTable
;

如果MyTable包含:

Num1    Operator    Num2
1       +           1
1       -           1

查询将返回:

Result
2
0

确保使用适当的数据类型存储值。如果不是,您可能会发现查询返回意外结果。

如果您需要支持更高级的选项,请考虑使用动态SQL。

答案 4 :(得分:0)

一种方法是使用XML(.query)和动态SQL:

DECLARE @sql nvarchar(max),
        @val1 float = 1,
        @val2 float = 2,
        @oper int =1

;WITH MathOperator  AS (
SELECT *
FROM (VALUES
(1, '+' ),
(2, '-'),
(3, '*'),
(4, 'div'), --instead of /
(5, '>'),
(6, '<')
) as t(ID, Operator)
)

SELECT @sql = N'
DECLARE @x xml = ''''; 
SELECT @x.query('''+CAST(@val1 as nvarchar(max))+' '+Operator+' '+CAST(@val2 as nvarchar(max))+''');'
FROM MathOperator
WHERE id = @oper

EXEC sp_executesql @sql

如果您将12与不同的@oper一起传递,您将获得:

oper    result
+       3
-       -1
*       2
/       0.5
>       true
<       false