这样的递归怎么做?!
<br />select a,<br />(select b from c where ...) as d,<br />e<br />from f,(select j from h where ...) as i<br />where ....<br />
我要把外层select … from …中,select后面的内容替换掉,而保留from后面的内容。最后变成:
<br />select count(*)<br />from f,(select j from h where ...) as i<br />where ....<br />
其实这相当于xml/html节点的替换,类似递归问题,想了很久也没想到解决方法。
——解决方案——————–
正
本文来*源gaodai^.ma#com搞#代!码网
搞gaodaima代码
则….不行
如果你只是想得到返回的行数, 你总是可以这样做:
select count(*) from (
— 你的sql —
select a,
(select b from c where …) as d,
e
from f,(select j from h where …) as i
where ….
) tmp
如果你非要严格做替换, 要做语法分析, 考虑到单双引号, 括号等等….
——解决方案——————–
不知道你是要写SQL指令,还是要做字符串替换
如果是做字符串替换,可以这么写
$s = <<< TXT<br />select a,<br />(select b from c where ...) as d,<br />e<br />from f,(select j from h where ...) as i<br />where ....<br />TXT;<br /><br />$ar = preg_split('/(\(?\bselect\b<br><font color='#FF8000'>------解决方案--------------------</font><br>\bfrom\b)/i', $s, -1, PREG_SPLIT_NO_EMPTY <br><font color='#FF8000'>------解决方案--------------------</font><br> PREG_SPLIT_DELIM_CAPTURE);<br /><br />$n = 0;<br />$st = array();<br />for($i=0; $i<count($ar); $i++) {<br /> $t = strtolower($ar[$i]);<br /> if($t == 'select' <br><font color='#FF8000'>------解决方案--------------------</font><br> $t == '(select') {<br /> $st[] = $i;<br /> }<br /> if($t == 'from') {<br /> if(count($st) == 1) break;<br /> array_pop($st);<br /> }<br />}<br />for($i--; $i>$st[0]+1; $i--) unset($ar[$i]);<br />$ar[$st[0]+1] = " count(*)\n";<br />echo join('', $ar);<br />
select count(*)
from f,(select j from h where …) as i
where ….