2013-08-01 14 views
5

Il backend è il server PostgreSQL 9.1.Ottieni i nomi dei parametri dalla query SQL

Sto cercando di creare report XML AdHoc. I file di report conterranno query SQL, che devono iniziare con un'istruzione SELECT. Le query SQL avranno parametri. A seconda del tipo di dati delle colonne associate, questi parametri saranno presentati all'utente in modo da fornire valori.

Una query SQL rought:

SELECT * FROM customers 
WHERE 
(
    [email protected]_code AND [email protected] 
    AND customers.type= 
    (
     SELECT type from types 
     WHERE [email protected]_code 
     AND types.is_active = @type_is_active 
    ) 
    AND customers.account_open_date BETWEEN @start_date AND @end_date 
) 
OR customers.flagged = @flagged; 

voglio ottenere l'elenco dei nomi delle colonne e dei parametri della stringa di query e metterli in un array di stringhe e di processo in seguito.

sono in grado di soddisfare solo i parametri utilizzando la seguente espressione regolare:

@(?)(?<parameter>\w+) 

Partite attesi:

[email protected]_code 
[email protected] 
[email protected]_code 
types.is_active = @type_is_active 
customers.account_open_date BETWEEN @start_date AND @end_date 
customers.flagged = @flagged 

Come per corrispondenza "@parameter", "=", e "BETWEEN" subito?

+0

Se stai usando XML allora perché non avere un elemento di parametri e risparmiare la fatica? – Romoku

+0

Quindi vuoi trovare il "@ {variablename}" nella tua query sql e sostituirlo con il valore reale che l'utente desidera? – ganders

+0

Ehi, grazie. :) Non pensi che la combinazione di SQL e XML potrebbe diventare piuttosto complicata? –

risposta

2

Lo so che è un po 'tardi, ma per l'amor future ricerche:

Penso che questo Regex soddisfa le proprie esigenze:

(\w+\.\w+(?:\s?\=\s?\@\w+|\sBETWEEN\s\@\w+\sAND\s\@\w+)) 

Controllare this Regex101 fiddle qui, e leggere attentamente la spiegazione per ogni parte di esso.

Fondamentalmente, cerca prima le colonne customer.xxx_yyy e quindi per = @variable o BETWEEN @variable1 AND @variable2.

gruppi catturati:

MATCH 1 
1. [37-75] 
`[email protected]_code` 

MATCH 2 
1. [80-108]  
`[email protected]` 

MATCH 3 
1. [184-205] 
`[email protected]_code` 

MATCH 4 
1. [218-251] 
`types.is_active = @type_is_active` 

MATCH 5 
1. [266-327] 
`customers.account_open_date BETWEEN @start_date AND @end_date` 

MATCH 6 
1. [333-361] 
`customers.flagged = @flagged`