我正在寻找一个正则表达式来从SQL SELECT语句中拆分字段列表.
我已经从查询的其余部分中提取了字段列表,所以我留下了一个字符串,可能看起来像:
field1,field2,field3,CONCAT(field1,field2) AS concatted,IF(field1 = field2,field3,field4) AS logic
Run Code Online (Sandbox Code Playgroud)
我认为逻辑方法是将字符串拆分为逗号,只要逗号不出现在parantheses中,所以我只需要找到正确的正则表达式来做到这一点......?
我想要实现的最终结果是找出哪些字段看起来是从表中直接选择,哪些字段是从SQL表达式中产生的,以便我以后可以决定是使用WHERE还是HAVING子句来过滤它们.
一旦我有了字段列表,我可以检查是否存在'AS'关键字虽然不完美,但应该按照我编写SQL的方式工作.
(奖励点用于建议另一种方法,即区分不是表达式但是有别名的字段,以及可能没有别名的表达式,或者可能但不使用'AS')
这个正则表达式应该工作:
/,(?![^()]*+\\))/
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)