2014-04-27 12 views
30

więc mam w moim PostgreSQL:Postgresql SELECT jeśli ciąg zawiera

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

Aby uprościć mój problem, Co chcę zrobić, to wybrać 'id' z TAG_TABLE gdy ciąg "aaaaaaaa" zawiera " Nazwa znacznika'. Tak idealnie, że tylko powinny powrócić „1”, który jest identyfikatorem dla nazwy znacznika „aaa”

To, co robię do tej pory:

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

Ale oczywiście to nie działa, ponieważ postgres uważa, że ​​"% tag_name%" oznacza wzorzec zawierający podciąg "tag_name" zamiast faktycznej wartości danych w tej kolumnie.

Jak przekazać nazwę zmiennej do wzorca ??

Odpowiedz

44

Powinieneś używać 'tag_name' poza cudzysłowami; następnie interpretowane jako pole rekordu. Połącz używając "||" z dosłownymi znakami procentowymi:

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

co dzieje się, gdy nazwa_znacznika to' "; drop tabela TAG_TABLE; -" '? –

+11

@Denis: Nic się nie dzieje. Nie otrzymujesz wiersza, ponieważ klauzula "WHERE" ma wartość "FALSE". Instrukcja nie jest dynamiczna, tylko wartości są konkatenowane, bez szans na iniekcję SQL. –

+1

nie powinien być uporządkowany w kolejności od aaaa i tag_name? mam na myśli, że powinieneś umieścić nazwę kolumny po numerze – user151496

17

Ja osobiście wolę prostszą składnię operatora ~.

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name; 

Warto przeczytać poprzez Difference between LIKE and ~ in Postgres, aby zrozumieć różnicę. `

+0

Działa to tylko wtedy, gdy 'nazwa_znacznika' jest właściwym REGEX. Dość ryzykowne. –

Powiązane problemy