2012-06-23 11 views
6

Estoy buscando una expresión regular para dividir una lista de campos de una declaración SQL SELECT.PHP Regex para dividir una lista de campos SQL

que ya han extraído la lista de campos del resto de la consulta, por lo que me quedo con una cadena que puede parecer:

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

creo que el enfoque lógico sería dividir la cadena en una coma, siempre que la coma no aparezca dentro de parantheses, entonces solo necesito encontrar la expresión regular correcta para hacer eso ...?

El resultado final de lo que estoy tratando de lograr es averiguar qué campos parecen ser directamente seleccionados de la tabla, y cuáles están hechos de expresiones de SQL, para poder decidir más adelante si se deben filtrar usando DONDE o TENER cláusulas.

Una vez que tengo la lista de campos, puedo verificar la presencia de la palabra clave 'AS' que, aunque no es perfecta, debería funcionar con la forma en que escribo SQL.

(Los puntos de bonificación para sugerir otra manera de que differenciates entre los campos que no son expresiones, pero que son alias, y expresiones que pueden no tener un alias, o puede ser, pero sin utilizar 'AS')

Respuesta

4

Esta expresión regular debe trabajo:

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

Un ejemplo de implementación en PHP, aquí:

$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); 
} 
+0

parece hacer el trabajo a la perfección, gracias! – Codecraft

0

cuando se trata de t o analizar lenguajes irregulares como SQL, siempre debe ir con un analizador apropiado en lugar de algunas expresiones regulares.

En su caso, podría usar este SQL parser in PHP o PEAR’s SQL_Parser.