2009年6月16日火曜日

[PHP]SQL文からテーブル名を取得する

言語は、PHPです。

元ネタは、コチラ


$tables = array();
if (preg_match_all("/(.*\s+from\s+(\w+(\.\w+)?).*)|(.*\s+join\s+(\w+(\.\w+)?).*)/i", $sqlstr, $matches)) {
  foreach($matches as $varry) {
    if (is_array($varry)) {
      foreach($varry as $v) {
        if (!empty($v)
          && !preg_match("/^(\.)|(\s*)(SELECT|JOIN|FROM).*/i", $v)) {
          $tables[] = $v;
        }
      }
    } else {
      if (!empty($varry)
        && !preg_match("/^(\.)|(\s*)(SELECT|JOIN|FROM).*/i", $varry)) {
        $tables[] = $varry;
      }
    }
  }
}


正規表現一発でテーブル名を取得しようと思っても、
サブクエリ使ってたりJOIN使ってたりしたら、
なかなか上手くいかないですよね。。。

正規表現一発ではうまくいかなくても
何とか取って来れないかと試行錯誤しました。

なんとか取得できてるっぽいです。
↓こんなSQLでもちゃんとテーブル名だけを返してくれます。

SELECT
a.usage_amount -- test1
,b.charge #test2
,c.* /*
test3
*/
from (
SELECT shop_id, sum(usage_amount) as usage_amount
FROM v0.usagex
GROUP BY (shop_id)
) a
LEFT OUTER JOIN (
SELECT shop_id, sum(charge) as charge
FROM v0.history
GROUP BY (shop_id)
)b on a.shop_id = b.shop_id
INNER JOIN v0.contract c on c.shop_id = a.shop_id


※↑この例の場合、先のコーディングで、$tablesには
  ・v0.usagex
  ・v0.history
  ・v0.contract
 が返されます。

0 件のコメント:

コメントを投稿

どうかお気軽にコメント頂ければ幸いです。