【问题标题】:Get the SELECT block of a SQL Query using regex in PHP在 PHP 中使用正则表达式获取 SQL 查询的 SELECT 块
【发布时间】:2012-08-20 08:00:57
【问题描述】:

我想获取 SQL 查询的 SELECT 块,而我想的是获取 SELECT 和 FROM 之间的文本。我应该使用什么正则表达式?

是否可以以相同的方式提取 FROM、WHERE 和 JOIN 块?

更新

我不能使用http://code.google.com/p/php-sql-parser/,因为它是为 MySQL 构建的,而我的 MSSQL 查询破坏了它。我已经搜索了很多 MSSQL 解析器,但找不到现成的解决方案,所以我能想到的唯一方法是自己使用正则表达式解析 SQL,并按照选择块位于 SELECT 和 FROM 之间的原则工作关键词。

示例

查询

SELECT STRAIGHT_JOIN a,b,c 
FROM some_table an_alias
WHERE d > 5;

我想要这样的东西被退回:

$result['SELECT'] => 'STRAIGHT_JOIN a,b,c';
$result['FROM'] => 'some_table an_alias';
$result['WHERE'] => 'd>5';

【问题讨论】:

  • 不清楚你想要什么,请添加1个例子。

标签: php regex


【解决方案1】:

您可以使用 SQL 解析器库为您执行此操作。

签出这个项目http://code.google.com/p/php-sql-parser/

示例输入:

SELECT STRAIGHT_JOIN a,b,c 
  from some_table an_alias
 WHERE d > 5;

样本输出:

Array
( 
[OPTIONS] => Array
    (
        [0] => STRAIGHT_JOIN
    )       

[SELECT] => Array
    (
        [0] => Array
            (
                [expr_type] => colref
                [base_expr] => a
                [sub_tree] => 
                [alias] => `a`
            )

        [1] => Array
            (
                [expr_type] => colref
                [base_expr] => b
                [sub_tree] => 
                [alias] => `b`
            )

        [2] => Array
            (
                [expr_type] => colref
                [base_expr] => c
                [sub_tree] => 
                [alias] => `c`
            )

    )

[FROM] => Array
    (
        [0] => Array
            (
                [table] => some_table
                [alias] => an_alias
                [join_type] => JOIN
                [ref_type] => 
                [ref_clause] => 
                [base_expr] => 
                [sub_tree] => 
            )

    )

[WHERE] => Array
    (
        [0] => Array
            (
                [expr_type] => colref
                [base_expr] => d
                [sub_tree] => 
            )

        [1] => Array
            (
                [expr_type] => operator
                [base_expr] => >
                [sub_tree] => 
            )

        [2] => Array
            (
                [expr_type] => const
                [base_expr] => 5
                [sub_tree] => 
            )

    )

)

【讨论】:

  • 我不能使用这个解析器的唯一原因是因为它针对 MySQL 进行了优化,我的查询是 MSSQL,结果被破坏了......
  • 我相信 php-sql-parser 应该支持以某种方式为其他 SQL 方言配置:If using another database dialect, then you may want to change the reserved words - see the ParserManual
【解决方案2】:

看看这个链接:

http://code.google.com/p/php-sql-parser/

Example Output

Example Query

SELECT STRAIGHT_JOIN a,b,c 
  from some_table an_alias
 WHERE d > 5;

Example Output (via print_r)

Array
( 
    [OPTIONS] => Array
        (
            [0] => STRAIGHT_JOIN
        )       

    [SELECT] => Array
        (
            [0] => Array
                (
                    [expr_type] => colref
                    [base_expr] => a
                    [sub_tree] => 
                    [alias] => `a`
                )

            [1] => Array
                (
                    [expr_type] => colref
                    [base_expr] => b
                    [sub_tree] => 
                    [alias] => `b`
                )

            [2] => Array
                (
                    [expr_type] => colref
                    [base_expr] => c
                    [sub_tree] => 
                    [alias] => `c`
                )

        )

    [FROM] => Array
        (
            [0] => Array
                (
                    [table] => some_table
                    [alias] => an_alias
                    [join_type] => JOIN
                    [ref_type] => 
                    [ref_clause] => 
                    [base_expr] => 
                    [sub_tree] => 
                )

        )

    [WHERE] => Array
        (
            [0] => Array
                (
                    [expr_type] => colref
                    [base_expr] => d
                    [sub_tree] => 
                )

            [1] => Array
                (
                    [expr_type] => operator
                    [base_expr] => >
                    [sub_tree] => 
                )

            [2] => Array
                (
                    [expr_type] => const
                    [base_expr] => 5
                    [sub_tree] => 
                )

        )

)

【讨论】:

    【解决方案3】:
    $matches = array();
    $sql = 'SELECT STRAIGHT_JOIN a,b,c FROM some_table an_alias WHERE d > 5;';
    preg_match_all('/SELECT(.+?)FROM(.+?)(?:JOIN(.+?))*WHERE(.+)/gis', $sql, $matches);
    

    将产生:

    [0] => Array
        (
            [0] => SELECT STRAIGHT_JOIN a,b,c FROM some_table an_alias WHERE d > 5;
        )
    
    [1] => Array
        (
            [0] =>  STRAIGHT_JOIN a,b,c 
        )
    
    [2] => Array
        (
            [0] =>  some_table an_alias 
        )
    
    [3] => Array
        (
            [0] => 
        )
    
    [4] => Array
        (
            [0] =>  d > 5;
        )
    

    【讨论】:

    • 这看起来是朝着正确方向迈出的一步。我试过 preg_match_all("/SELECT(.+?)FROM(.+?)(?:JOIN(.+?))*WHERE(.+)/i", $sql, $arr); print_r($arr);并得到了一些空数组......
    猜你喜欢
    • 2018-07-14
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2023-04-06
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多