首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > PHP >

这样的递归如何做?

2013-01-04 
这样的递归怎么做?!select a,(select b from c where ...) as d,efrom f,(select j from h where ...) as

这样的递归怎么做?!


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<count($ar); $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 ....

热点排行