我需要从字符串集中计算出值

时间:2018-06-14 16:34:11

标签: sql-server

如何从字符串中获取价值?例如,我已将值存储在表

Field | Value 
-------------
A1   | '1 +  2'
A2   | '1 *  2'

我需要一个选择查询,结果应该如下

A1  -- 3
A2  -- 2

我写了

SELECT Field,Value from Table

结果变成

A1 -- 1 + 2
A2 -- 1 * 2

4 个答案:

答案 0 :(得分:1)

首先,我不建议你这样做。对于RDBMS而言,这不是一个好习惯。

正如其他人指出的那样,你可以拆分第一个val,第二个val和运算符。只要val和操作员之间有空格,这就可以工作。如果他们三个都被捣碎在一起,你将不得不用patindex来写这个。

DECLARE @val1 VARCHAR(100) 
DECLARE @val2 VARCHAR(100)
DECLARE @operator VARCHAR(100)
DECLARE @string1 VARCHAR(100) = '1 +  2'
DECLARE @string2 VARCHAR(100) = '1 *  2'
DECLARE @string3 VARCHAR(100) = '4 / 2'
DECLARE @string4 VARCHAR(100) = '234 + 3245'
DECLARE @string5 VARCHAR(100) = '90 % 10'

SET @val1  = LTRIM(RTRIM((SUBSTRING(@string1, 1, CHARINDEX(' ', @string1, 0)))))
SET @val2 = LTRIM(RTRIM((REVERSE(SUBSTRING(REVERSE(@string1), 1, CHARINDEX(' ', REVERSE(@string1), 0))))))
SET @operator = LTRIM(RTRIM(REPLACE(REPLACE(@string1, @val1, ''), @val2, '')))
DECLARE @sql1 NVARCHAR(100) = 'SELECT ' + @val1 + @operator + @val2

SET @val1  = LTRIM(RTRIM((SUBSTRING(@string2, 1, CHARINDEX(' ', @string2, 0)))))
SET @val2 = LTRIM(RTRIM((REVERSE(SUBSTRING(REVERSE(@string2), 1, CHARINDEX(' ', REVERSE(@string2), 0))))))
SET @operator = LTRIM(RTRIM(REPLACE(REPLACE(@string2, @val1, ''), @val2, '')))
DECLARE @sql2 NVARCHAR(100) = 'SELECT ' + @val1 + @operator + @val2


SET @val1  = LTRIM(RTRIM((SUBSTRING(@string3, 1, CHARINDEX(' ', @string3, 0)))))
SET @val2 = LTRIM(RTRIM((REVERSE(SUBSTRING(REVERSE(@string3), 1, CHARINDEX(' ', REVERSE(@string3), 0))))))
SET @operator = LTRIM(RTRIM(REPLACE(REPLACE(@string3, @val1, ''), @val2, '')))
DECLARE @sql3 NVARCHAR(100) = 'SELECT ' + @val1 + @operator + @val2


SET @val1  = LTRIM(RTRIM((SUBSTRING(@string4, 1, CHARINDEX(' ', @string4, 0)))))
SET @val2 = LTRIM(RTRIM((REVERSE(SUBSTRING(REVERSE(@string4), 1, CHARINDEX(' ', REVERSE(@string4), 0))))))
SET @operator = LTRIM(RTRIM(REPLACE(REPLACE(@string4, @val1, ''), @val2, '')))
DECLARE @sql4 NVARCHAR(100) = 'SELECT ' + @val1 + @operator + @val2


SET @val1  = LTRIM(RTRIM((SUBSTRING(@string5, 1, CHARINDEX(' ', @string5, 0)))))
SET @val2 = LTRIM(RTRIM((REVERSE(SUBSTRING(REVERSE(@string5), 1, CHARINDEX(' ', REVERSE(@string5), 0))))))
SET @operator = LTRIM(RTRIM(REPLACE(REPLACE(@string5, @val1, ''), @val2, '')))
DECLARE @sql5 NVARCHAR(100) = 'SELECT ' + @val1 + @operator + @val2

print @sql1
EXEC sp_executesql @sql1
print @sql2
EXEC sp_executesql @sql2
print @sql3
EXEC sp_executesql @sql3
print @sql4
EXEC sp_executesql @sql4
print @sql5
EXEC sp_executesql @sql5

答案 1 :(得分:0)

您可以通过数学运算符+或*拆分值列,然后检查它是否为数值。然后用你所做的实际操作。

您可以使用STRING_SPLIT功能进行拆分

答案 2 :(得分:0)

您需要创建一个自定义函数来解析投射每个数值的字符串并选择运算符。

答案 3 :(得分:0)

如您所知,SQL Server没有EVAL()功能。但是,使用一点动态SQL,这是可能的,但实际上并不推荐。

示例

Declare @YourTable Table ([Field] varchar(50),[Value] varchar(50))
Insert Into @YourTable Values 
 ('A1','1 + 2')
,('A2','1 * 2')
,('A3','datediff(DAY,''2018-01-01'',getdate())')  -- Added Just for Fun

Declare @SQL varchar(max)
Select @SQL = Stuff((Select ',' +S 
 From (Select S=concat('(''',[Field],''',',[Value],')') From  @YourTable ) A
 For XML Path ('')),1,1,'')

Exec('Select * from (values ' + @SQL + ')A([Field],[Value])')

<强>返回

Field   Value
A1      3
A2      2
A3      164