首页 > 解决方案 > 按公式计算由单个字符串组成,并用特殊符号分隔

问题描述

测试 DDL

with cte as (
    select '0001' ID,1 InputValue,'Qty*2;Qty*5' Formulas union all
    select '0002' ID,2 InputValue,'Qty+4;Qty/5' Formulas 
)
select * into T from cte

--Query Data
ID      ,InputValue ,Formulas       
0001    ,1          ,Qty*2;Qty*5    
0002    ,2          ,Qty+4;Qty/5    

预期的

调用 somefunction 或 sqlquery 得到以下结果

ID      ,InputValue ,Formulas       ,Qty1   ,Qty2
0001    ,1          ,Qty*2;Qty*5    ,2      ,5
0002    ,2          ,Qty+4;Qty/5    ,6      ,0.4

逻辑

公式被截断;
inputvalue 使用第一个公式计算 qty1 字段
inputvalue 使用第二个公式计算 qty2 字段

我的测试

目前我的解决方案是使用C#编程来解决问题

    using (var cn = Connection)
    {
        cn.Open();

        var datas = cn.Query(@"
            with cte as (
                select '0001' ID,1 InputValue,'Qty*2;Qty*5' Formulas union all
                select '0002' ID,2 InputValue,'Qty+4;Qty/5' Formulas 
            )
            select * into #T from cte;
            select * from #T;
        ");

        var result = datas.Select(s => {
            var arr = (s.Formulas as string).Split(';');
            var qtyFor = arr[0].Replace("Qty",  Convert.ToString(s.InputValue));
            var qty1For = arr[1].Replace("Qty",  Convert.ToString(s.InputValue));
            var qty = new DataTable().Compute(qtyFor, string.Empty);
            var qty1 = new DataTable().Compute(qty1For, string.Empty);
            return new {s.ID,s.InputValue,s.Formulas,Qty=qty,Qty1=qty1};
        });

        Console.WriteLine(result);
        /*
            Result:
            ID      ,InputValue ,Formulas       ,Qty1   ,Qty2
            0001    ,1          ,Qty*2;Qty*5    ,2      ,5
            0002    ,2          ,Qty+4;Qty/5    ,6      ,0.4
        */
    }

在线测试链接


我知道这个表结构很奇怪,但这是一个没有源代码的旧系统,所以我无法修复表结构

标签: sqlsql-server

解决方案


推荐阅读