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 等不规则语言时,您应该始终使用适当的解析器而不是一些正则表达式。

在您的情况下,您可以在 PHP或PEAR 的 SQL_Parser中使用此SQL 解析器

于 2012-06-23T15:18:36.890 回答