2014-04-27 20 views
30

quindi ho un mio PostgreSQL:PostgreSQL SELEZIONA se stringa contiene

TAG_TABLE 
========================== 
id   tag_name  
-------------------------- 
1    aaa 
2    bbb 
3    ccc 

Per semplificare il mio problema, Quello che voglio fare è selezionare 'id' dal TAG_TABLE quando una stringa "aaaaaaaa" contiene il ' tag_name'. Così Idealmente, dovrebbe soltanto il ritorno "1", che è l'ID per il nome tag 'aaa'

Questo è quello che sto facendo finora:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaaaaa' LIKE '%tag_name%' 

Ma, ovviamente, questo non funziona, dal momento che postgres pensa che '% tag_name%' significhi un pattern contenente la sottostringa 'tag_name' invece del valore di dati effettivo sotto quella colonna.

Come si passa il tag_name allo schema ??

risposta

44

È necessario utilizzare "tag_name" al di fuori delle virgolette; quindi è interpretato come un campo del record. Concatena usando '||' con i segni percentuali letterali:

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' LIKE '%' || tag_name || '%'; 
+1

quali feci quando tag_name è' "; drop table TAG_TABLE; -" '? –

+11

@Denis: non succede nulla. Non ottieni nessuna riga, perché la clausola 'WHERE' restituisce' FALSE'. L'istruzione non è dinamica, solo i valori sono concatenati, nessuna possibilità per l'iniezione SQL. –

+1

non dovrebbe essere l'ordine di aaaa e tag_name invertiti? Voglio dire che dovresti mettere un nome di colonna dopo dove – user151496

17

Personalmente preferisco la sintassi più semplice dell'operatore ~.

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name; 

Vale la lettura attraverso Difference between LIKE and ~ in Postgres per capire la differenza. `

+0

Funziona solo quando 'tag_name' è un REGEX corretto. Piuttosto rischioso. –

Problemi correlati