Home > Backend Development > PHP Tutorial > 这样的递归如何做?

这样的递归如何做?

WBOY
Release: 2016-06-13 12:59:42
Original
926 people have browsed it

这样的递归怎么做?!

<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 />
Copy after login

我要把外层select ... from ...中,select后面的内容替换掉,而保留from后面的内容。最后变成:
<br />
select count(*)<br />
from f,(select j from h where ...) as i<br />
where ....<br />
Copy after login

其实这相当于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);
Copy after login

select count(*)
from f,(select j from h where ...) as i
where ....

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template