2014-04-27 16 views
30

Vì vậy, tôi có một trong PostgreSQL của tôi:PostgreSQL CHỌN nếu chuỗi chứa

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

Để đơn giản hóa vấn đề của tôi, Những gì tôi muốn làm là SELECT 'id' từ TAG_TABLE khi một chuỗi "aaaaaaaa" chứa ' tag_name '. Vì vậy, lý tưởng, nó chỉ nên trở về "1", đó là ID cho tên thẻ 'aaa'

Đây là những gì tôi đang làm cho đến nay:

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

Nhưng rõ ràng, điều này không làm việc, vì postgres nghĩ rằng '% tag_name%' có nghĩa là một mẫu chứa chuỗi con 'tag_name' thay vì giá trị dữ liệu thực tế trong cột đó.

Làm cách nào để chuyển tên người dùng vào mẫu?

Trả lời

44

Bạn nên sử dụng 'tag_name' bên ngoài dấu ngoặc kép; sau đó nó được hiểu là một trường của bản ghi. Kết hợp bằng '||' với các dấu hiệu phần trăm theo nghĩa đen:

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

những gì hapoens khi tag_name là' "; bảng thả xuống TAG_TABLE; -" '? –

+11

@Denis: Không có gì xảy ra. Bạn không nhận được hàng nào, vì mệnh đề 'WHERE' đánh giá thành' FALSE'. Câu lệnh không phải là động, chỉ các giá trị được nối, không có cơ hội cho việc chèn SQL. –

+1

không nên là thứ tự của aaaa và tag_name được đảo ngược? tôi có nghĩa là bạn nên đặt một tên cột sau khi – user151496

17

Cá nhân tôi thích cú pháp đơn giản hơn của toán tử ~.

SELECT id FROM TAG_TABLE WHERE 'aaaaaaaa' ~ tag_name; 

Đọc giá trị thông qua Difference between LIKE and ~ in Postgres để hiểu sự khác biệt. `

+0

Chỉ hoạt động khi 'tag_name' là REGEX thích hợp. Khá mạo hiểm. –

Các vấn đề liên quan