2011-08-28 46 views
10

Tôi đang truy vấn một cơ sở dữ liệu trong Postgres bằng cách sử dụng psql. Tôi đã sử dụng các truy vấn sau đây để tìm kiếm một lĩnh vực được gọi thẻ rằng có một loạt các văn bản vì nó là kiểu dữ liệu:Postgres Truy vấn một mảng bằng cách sử dụng LIKE

select count(*) from planet_osm_ways where 'highway' = ANY(tags); 

bây giờ tôi cần phải tạo ra một truy vấn để tìm kiếm các thẻ lĩnh vực cho bất kỳ từ nào bắt đầu với chữ 'A'. Tôi đã thử các cách sau:

select count(*) from planet_osm_ways where 'A%' LIKE ANY(tags); 

Điều này mang lại cho tôi lỗi cú pháp. Bất kỳ đề xuất về cách sử dụng LIKE với một mảng văn bản?

Trả lời

15

Sử dụng unnest() chức năng để chuyển đổi mảng để thiết lập hàng:

SELECT count(distinct id) 
FROM (
    SELECT id, unnest(tags) tag 
    FROM planet_osm_ways) x 
WHERE tag LIKE 'A%' 

Các count(dictinct id) nên tính mục duy nhất từ ​​planet_osm_ways bảng, chỉ cần thay thế id với tên khóa chính của bạn. Điều đó đang được nói, bạn thực sự nên suy nghĩ về việc lưu trữ các thẻ trong một bảng riêng biệt, với mối quan hệ nhiều người với planet_osm_ways hoặc tạo một bảng riêng cho các thẻ sẽ có mối quan hệ nhiều - nhiều với planet_osm_ways. Cách bạn lưu trữ thẻ giờ đây khiến bạn không thể sử dụng chỉ mục trong khi tìm kiếm thẻ, điều đó có nghĩa là mỗi tìm kiếm thực hiện quét toàn bộ bảng.

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