2016-09-29 133 views
3

這就是我要做的:SQL:字符串轉換爲數學運算符

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 

這可能嗎?

+1

這是不可能的,除非你使用動態SQL。 –

+0

'select 1> = 2'無論如何都會引發錯誤。除了'選擇'1' - '2''通常它不會工作,除非您首先檢查運算符並且參數包含有效組合。 – Serg

+0

使用'.query'可以解決'>'和'<'運算符的問題。 – gofr1

回答

2

使用動態SQL

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

爲此,您可以使用動態SQL:

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

declare @sql nvarchar(max) = 'select 1 @operator 2 -- should be as: select 1+2'; 

set @sql = replace(@sql, '@operator', @operator); 

exec sp_executesql @sql; 

當然,<=>=不會在這方面的工作,所以他們會產生一個錯誤。

+0

你是對的,我刪除了這些運營商 – Eyal

1

是它的更多鈔票。您可以使用動態查詢

樣品:

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

EXEC (@STRQUERY) 

END 
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。

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