原来发过一贴:http://topic.csdn.net/u/20100701/10/f6775186-c335-4032-9277-0b6907257c06.html
解决了转换问题,但是有两个问题没有解决,一是case嵌套,就是任意值里面还有case,二是出现无关的两次case结果会出错,但这种情况很常见,在这里请求完美解决方式。如果真的解决了case嵌套,另开贴再送100分。---------------------------------------------------
原帖问题:
Access数据库和SQL数据库的语句需要转换:转换前:Case 任意值0 When 任意值1 Then 任意值2 When 任意值3 Then 任意值4 Else 任意值5 End
转换后:IIf(任意值0=任意值1, 任意值2, IIf(任意值0=任意值3, 任意值4, 任意值5))
说明:
1、所有关键字不区分大小写
2、When 任意值A Then 任意值B //这种情况可能1次或重复多次
3、后面的 Else 任意值 不存在的话返回 null,例如:IIf(任意值0=任意值3, 任意值4, null)。如果不好实现也可以假设都存在Else
还有一种稍简单的情况:
转换前:Case When 任意值1 Then 任意值2 When 任意值3 Then 任意值4 Else 任意值5 End
转换后:IIf(任意值1, 任意值2, IIf(任意值3, 任意值4, 任意值5))

解决方案 »

  1.   

    现在是两个case嵌套的问题,和两个case并列的问题。
      

  2.   

    我上一帖子给你的代码,对于你这里的两个例子都是适用的,和你给的转换后的结果是一致的,这有什么问题吗?string[] test = new string[] { "Case 任意值0 When 任意值1 Then 任意值2 When 任意值3 Then 任意值4 Else 任意值5 End", "Case When 任意值1 Then 任意值2 When 任意值3 Then 任意值4 Else 任意值5 End" };
    foreach (string s in test)
    {
        string varr = string.Empty;
        int count = 0;
        bool flag = false;
        Regex reg = new Regex(@"(?i)\s*((?<var>When)\s*(?<val>\S+)\s*Then\s*(?<opt>\S+)|(?<var>Case)\s*(?<varr>\S*)(?=\s*When)|(?<var>Else)\s*(?<opt>\S+)|(?<var>End))\s*");
        string result = reg.Replace(s, delegate(Match m)
        {
            switch (m.Groups["var"].Value.ToLower())
            {
                case "case":
                    varr = m.Groups["varr"].Value;
                    return "IIf(" + (varr == "" ? "" : varr + "=");
                case "when":
                    if (count == 0)
                    {
                        count++;
                        return m.Groups["val"].Value + ", " + m.Groups["opt"].Value;
                    }
                    else
                    {
                        count++;
                        return ", IIf(" + (varr == "" ? "" : varr + "=") + m.Groups["val"].Value + ", " + m.Groups["opt"].Value;
                    }
                case "else":
                    flag = true;
                    return ", " + m.Groups["opt"].Value;
                default:
                    if (!flag)
                        return ", null" + new string(')', count);
                    return new string(')', count);
            }
        });
        richTextBox2.Text += "源字符串:" + s + "\n替换结果:" + result + "\n-------------------------------------\n";
    }
    /*----------输出---------
    源字符串:Case 任意值0 When 任意值1 Then 任意值2 When 任意值3 Then 任意值4 Else 任意值5 End
    替换结果:IIf(任意值0=任意值1, 任意值2, IIf(任意值0=任意值3, 任意值4, 任意值5))
    -------------------------------------
    源字符串:Case When 任意值1 Then 任意值2 When 任意值3 Then 任意值4 Else 任意值5 End
    替换结果:IIf(任意值1, 任意值2, IIf(任意值3, 任意值4, 任意值5))
    -------------------------------------
    */
      

  3.   

    楼上:
    正常情况可以解决,但是复杂的SQL语句中,会有case嵌套,或者多个case出现,这两种情况不能解决。
    嵌套+多case例子:
    -- select 语句用到了嵌套,where语句又出现了case
       select case a when b zhen case c when d zhen e else f end when g zhen h end
       from table1
       where (case  a zhen b else c end) = b我现在准备增加递归代码来处理...