这样的递归如何做?

WBOY
发布: 2016-06-13 12:59:42
原创
893 人浏览过

这样的递归怎么做?!

<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节点的替换,类似递归问题,想了很久也没想到解决方法。
------解决方案--------------------
正则....不行

如果你只是想得到返回的行数, 你总是可以这样做:
select count(*) from (

-- 你的sql --<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 />
) 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;

$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 $t = strtolower($ar[$i]);
if($t == 'select'
------解决方案--------------------
$t == '(select') {
$st[] = $i;
}
if($t == 'from') {
if(count($st) == 1) break;
array_pop($st);
}
}
for($i--; $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 ....

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!