ホームページ > バックエンド開発 > PHPチュートリアル > このような再帰はどのように行うのでしょうか?

このような再帰はどのように行うのでしょうか?

WBOY
リリース: 2016-06-13 12:59:42
オリジナル
926 人が閲覧しました

このような再帰はどのように行うのでしょうか? !

<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 />
ログイン後にコピー

from以降の内容を保持したまま、外層select...from...のselect以降の内容を置き換えたいと考えています。最終的には次のようになります:
<br />
select count(*)<br />
from f,(select j from h where ...) as i<br />
where ....<br />
ログイン後にコピー

実際、これは xml/html ノードの置き換えに相当し、再帰的問題と同様に、長い間考えましたが、解決策がまだ思いつきませんでした。
------解決策------------------
通常....機能しません

返された行数を取得したいだけの場合は、いつでもこれを行うことができます:
select count(*) from (

-- あなたの SQL --
を選択し、
(c から b を選択します...) d,
として え
from f,(select j from h where ...) as i
ここで....

) 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);
ログイン後にコピー

カウントを選択(*)
from f,(select j from h where ...) as i
ここで....

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート