我正在寻找一个正则表达式来从SQL SELECT语句中拆分字段列表。
我已经从查询的其余部分中提取了字段列表,因此我留下了一个可能如下的字符串:
field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic
我认为逻辑方法是将字符串拆分为逗号,只要逗号不出现在parantheses中,所以我只需要找到正确的正则表达式来做那个......?
我想要实现的最终结果是找出哪些字段看起来是从表中直接选择的,哪些字段是从SQL表达式中做出的,这样我以后可以决定是否使用WHERE过滤它们或者有条款。
一旦我有了字段列表,我可以检查是否存在'AS'关键字虽然不完美,但应该与我编写SQL的方式一起使用。
(奖励积分用于建议在不是表达式但是别名的字段之间区分的另一种方式,以及可能没有别名的表达式,或者可能但不使用'AS')
答案 0 :(得分:4)
这个正则表达式应该有效:
/,(?![^()]*+\\))/
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);
}
答案 1 :(得分:0)
当解析像SQL这样的不规则语言时,你应该总是使用适当的解析器而不是一些正则表达式。
在您的情况下,您可以使用此SQL parser in PHP或PEAR’s SQL_Parser。