原来发过一贴: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))
解决了转换问题,但是有两个问题没有解决,一是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))
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))
-------------------------------------
*/
正常情况可以解决,但是复杂的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我现在准备增加递归代码来处理...