我有一个表,其中的一列包含引用另一个表中项目的公式。带有公式的表格如下所示:
Formula
A+B
A*B-C
X+Y-Z
...
查找表如下所示
Id Value
A 10
B 200
C 75
... ...
我想用公式导出表中的新列,并得出表达式的结果:
Formula Result
A+B 210
A*B-C 135
X+Y-Z 5
... ...
当前,这两个表放置在SQL数据库中,其中公式表非常小(大约3亿行),查找表非常大(也大约3亿行)。
欢迎使用除使用SQL之外的其他方法。实际上,只要能有效地完成工作,任何方法都可以。有处理任务的想法吗?
答案 0 :(得分:0)
带有游标的SQL:
表格:
Create Table #formulas
(
f VarChar(25)
)
Insert Into #formulas Values
('A+B'),
('A*B-C'),
('X+Y-Z')
Create Table #v
(
id char(1),
v Int
)
Insert Into #v Values
('A', 10),
('B', 200),
('C', 75),
('X', 100),
('Y', 110),
('Z', 10)
Create Table #t
(
f VarChar(25),
v Float
)
使用游标遍历您的记录:创建动态SQL语句并执行到表#t中。
Declare @vStr nVarChar(50)
Declare @v1 nVarChar(20)
Declare @op1 nVarChar(20)
Declare @v2 nVarChar(20)
Declare @op2 nVarchar(20)
Declare @v3 nVarchar(20)
Declare vCursor Cursor For
Select
(Select distinct v From #v Where id = Substring(f,1,1)) As 'v1',
Substring(f,2,1) As 'op1',
(Select distinct v From #v Where id = Substring(f,3,1)) As 'v2',
Substring(f,4,1) As 'op2',
(Select distinct v From #v Where id = Substring(f,5,1)) As 'v3'
From #formulas;
Open vCursor
Fetch Next From vCursor Into
@v1,
@op1,
@v2,
@op2,
@v3
While @@FETCH_STATUS = 0
Begin
Set @vStr = Case When @v3 Is Null
Then 'Select '''+ @v1 + @op1 + @v2 + ''',(' + @v1 + @op1 + @v2 + ')'
Else 'Select '''+ @v1 + @op1 + @v2 + @op2 + @v3 + ''',(' + @v1 + @op1 + @v2 + @op2 + @v3 + ')'
End
Insert Into #t(f,v) Execute (@vStr)
Fetch Next From vCursor Into
@v1,
@op1,
@v2,
@op2,
@v3
End
Close vCursor
Deallocate vCursor
Select * From #t
Drop Table #formulas
Drop Table #v
Drop Table #t
结果:
f v
10+200 210
10*200-75 1925
100+110-10 200