Jadi saya punya di Postgresql saya:
TAG_TABLE
==========================
id tag_name
--------------------------
1 aaa
2 bbb
3 ccc
Untuk menyederhanakan masalah saya, Yang ingin saya lakukan adalah PILIH 'id' dari TAG_TABLE ketika string "aaaaaaaa" berisi 'tag_name'. Idealnya, ini hanya mengembalikan "1", yang merupakan ID untuk nama tag 'aaa'
Inilah yang saya lakukan sejauh ini:
SELECT id FROM TAG_TABLE WHERE 'aaaaaaaaaaa' LIKE '%tag_name%'
Tapi jelas, ini tidak berfungsi, karena postgres berpikir bahwa '% tag_name%' berarti pola yang berisi substring 'tag_name' alih-alih nilai data aktual di bawah kolom itu.
Bagaimana cara mengirimkan tag_name ke pola ??
sql
postgresql
pengguna2436815
sumber
sumber
"; drop table TAG_TABLE; --"
?WHERE
klausa mengevaluasi keFALSE
. Pernyataan tersebut tidak dinamis, hanya nilai yang digabungkan, tidak ada peluang untuk injeksi SQL.LIKE
kata kunci.LIKE
pola mungkin memiliki konsekuensi yang tidak diinginkan saat variabel tersebut berisi garis bawah (_) atau persen karakter (%). Mungkin perlu untuk keluar dari karakter ini, misalnya dengan fungsi ini:CREATE OR REPLACE FUNCTION quote_for_like(text) RETURNS text LANGUAGE SQL IMMUTABLE AS $$ SELECT regexp_replace($1, '([\%_])', '\\\1', 'g'); $$;
(dari pengguna MatheusOl dari saluran IRC #postgresql di Freenode).Saya pribadi lebih suka sintaks yang lebih sederhana dari ~ operator.
Layak dibaca Perbedaan antara LIKE dan ~ di Postgres untuk memahami perbedaannya. `
sumber
tag_name
REGEX tepat. Cukup beresiko.***=
yang disebutkan di postgresql.org/docs/current/static/functions-matching.html . Namun saya telah menemukan bahwa menjadi terlalu lambat dibandingkan denganstrpos
/position
solutions.Cara yang tepat untuk mencari substring adalah dengan menggunakan
position
fungsi alih-alihlike
ekspresi, yang membutuhkan pelolosan%
,_
dan karakter pelolosan (\
secara default):sumber
LIKE
danILIKE
dapat menggunakangin
indeks.position
tidak bisa.Selain solusi dengan
'aaaaaaaa' LIKE '%' || tag_name || '%'
adaposition
(urutan argumen dibalik) danstrpos
.Selain apa yang lebih efisien (LIKE terlihat kurang efisien, tetapi indeks dapat mengubah banyak hal), ada masalah yang sangat kecil dengan LIKE: tag_name tentu saja tidak boleh berisi
%
dan terutama_
(wildcard karakter tunggal), untuk tidak memberikan positif palsu.sumber
tag_name
harus di kutip jika tidak maka akan memberikan kesalahan karena tag_name tidak adasumber