Postgresql Chọn các hàng trong đó cột = mảng


79

Đây là bản tóm tắt những gì tôi đang cố gắng thực hiện:

$array[0] = 1;
$array[1] = 2;

$sql = "SELECT * FROM table WHERE some_id = $array"

Rõ ràng là có một số vấn đề về cú pháp, nhưng đây là điều tôi muốn làm và tôi vẫn chưa tìm thấy bất kỳ điều gì cho thấy cách thực hiện.

Hiện tại, kế hoạch của tôi là làm điều gì đó theo những dòng sau:

foreach($idList as $is)
    $where .= 'some_id=' . $id . ' OR';
endforeach

$sql = "SELECT * FROM table WHERE " . $where;

Vì vậy, có hỗ trợ trong PostgreSQL để sử dụng một mảng để tìm kiếm hay tôi phải làm điều gì đó tương tự như giải pháp của mình?

Câu trả lời:


159
SELECT  *
FROM    table
WHERE   some_id = ANY(ARRAY[1, 2])

hoặc- ANSItương thích:

SELECT  *
FROM    table
WHERE   some_id IN (1, 2)

Các ANYcú pháp được ưa chuộng vì các mảng như một tổng thể có thể được thông qua trong một biến ràng buộc:

SELECT  *
FROM    table
WHERE   some_id = ANY(?::INT[])

Bạn sẽ cần chuyển một biểu diễn chuỗi của mảng: {1,2}


1
Cảm ơn, nó hoạt động! Những gì tôi đã kết thúc là: ".. some_id = ANY (ARRAY [". Implode (",", $ id_array). "])"
Jimmy Pitts

1
Xin chào SQL bơm với những nhận xét ở trên ... (implode php vào một truy vấn sql)
Angry 84

phần sau sẽ hoạt động tốt hơn: SELECT * FROM bảng WHERE some_id = ANY (unnest (? :: INT []))
WhiteWolfza

1
@WhiteWolfza: tại sao bạn nghĩ nó sẽ hoạt động tốt hơn?
Quassnoi

Điều này dường như không bảo toàn thứ tự trả về được xác định bởi đầu vào mảng. tức là select id from users where id in (2, 1)select id from users where id in (1, 2)luôn luôn trở lại theo thứ tự: 1, 2. Làm cách nào để quay lại 2, 1trong truy vấn đầu tiên?
yiwen

3

Để sử dụng SQL động:

'IN(' ||array_to_string(some_array, ',')||')'

Thí dụ

DO LANGUAGE PLPGSQL $$

DECLARE
    some_array bigint[];
    sql_statement text;

BEGIN

    SELECT array[1, 2] INTO some_array;
    RAISE NOTICE '%', some_array;

    sql_statement := 'SELECT * FROM my_table WHERE my_column IN(' ||array_to_string(some_array, ',')||')';
    RAISE NOTICE '%', sql_statement;

END;

$$;

Kết quả: NOTICE: {1,2} NOTICE: SELECT * FROM my_table WHERE my_column IN(1,2)


tôi không nghĩ = IN là cú pháp thích hợp
FlavorScape

@FlavorScape, ôi chao - đã sửa! Althogh, nó đã chạy một cách hoàn hảo (OFC tôi thử nghiệm một Tôi ví dụ bài ...), nhưng điều đó definetely trông tốt hơn nếu không có sự "="
UFO

chắc chắn không thành công với trình điều khiển PostgreSQL
FlavorScape

2
   $array[0] = 1;
   $array[2] = 2;
   $arrayTxt = implode( ',', $array);
   $sql = "SELECT * FROM table WHERE some_id in ($arrayTxt)"

1
Bạn cũng cần kiểm tra dữ liệu đầu vào: $ nums = array (); foreach ($ array dưới dạng $ a) if (is_numeric ($ a)) $ nums [] = $ a;
peschanko

1

Trong trường hợp của tôi, tôi cần làm việc với một cột có dữ liệu, vì vậy việc sử dụng IN () không hoạt động. Cảm ơn @Quassnoi về những ví dụ của anh ấy. Đây là giải pháp của tôi:

SELECT column(s) FROM table WHERE expr|column = ANY(STRING_TO_ARRAY(column,',')::INT[])

Tôi đã dành gần 6 giờ trước khi tôi vấp phải bài đăng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.