6

SQL SELECT ステートメントからフィールド リストを分割するための正規表現を探しています。

クエリの残りの部分からフィールド リストを抽出したので、次のような文字列が残ります。

field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic

コンマが括弧内に表示されない場合、論理的なアプローチはコンマで文字列を分割することだと思うので、それを行うための正しい正規表現を見つける必要があります...?

私が達成しようとしていることの最終結果は、テーブルから直接選択されたように見えるフィールドと、SQL 式から作成されたフィールドを見つけて、WHERE 句または HAVING 句を使用してそれらをフィルタリングするかどうかを後で決定できるようにすることです。 .

フィールドのリストを取得したら、「AS」キーワードの存在を確認できます。これは完全ではありませんが、SQL の記述方法で機能するはずです。

(式ではないがエイリアスが設定されているフィールドと、エイリアスが設定されていないか、エイリアスが設定されている可能性があるが「AS」を使用しない式を区別する別の方法を提案するためのボーナス ポイント)

4

2 に答える 2

5

この正規表現は機能するはずです:

/,(?![^()]*+\\))/

PHP での実装例は次のとおりです。

$vv = 'field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic';

$arr = preg_split ("/,(?![^()]*+\\))/", $vv);
foreach ($arr as &$value) {
    print($value);
}
于 2012-06-23T15:03:09.617 に答える
0

SQL のような不規則な言語の解析に関しては、正規表現ではなく、常に適切なパーサーを使用する必要があります。

あなたの場合、このSQL パーサーを PHPまたはPEAR の SQL_Parserで使用できます。

于 2012-06-23T15:18:36.890 に答える