• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

这样的递归如何做?

php 搞代码 4年前 (2022-01-24) 17次浏览 已收录 0个评论

这样的递归怎么做?!

<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 ….


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:这样的递归如何做?

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址