这样的递归怎么做?!
select a,
(select b from c where ...) as d,
e
from f,(select j from h where ...) as i
where ....
我要把外层select ... from ...中,select后面的内容替换掉,而保留from后面的内容。最后变成:
select count(*)
from f,(select j from h where ...) as i
where ....
其实这相当于xml/html节点的替换,类似递归问题,想了很久也没想到解决方法。
------解决方案--------------------
正则....不行
如果你只是想得到返回的行数, 你总是可以这样做:
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
select a,
(select b from c where ...) as d,
e
from f,(select j from h where ...) as i
where ....
txt;
$ar = preg_split('/(\(?\bselect\b
------解决方案--------------------
\bfrom\b)/i', $s, -1, preg_split_no_empty
------解决方案--------------------
preg_split_delim_capture);
$n = 0;
$st = array();
for($i=0; $i$st[0]+1; $i--) unset($ar[$i]);
$ar[$st[0]+1] = count(*)\n;
echo join('', $ar);
select count(*)
from f,(select j from h where ...) as i
where ....