Postgresql Виберіть рядки, де стовпець = масив


79

Це короткий виклад того, що я намагаюся зробити:

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

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

Очевидно, є деякі проблеми із синтаксисом, але це те, що я хочу зробити, і я ще не знайшов нічого, що показує, як це зробити.

Наразі я маю намір зробити щось подібне:

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

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

Тож чи є у PostgreSQL підтримка використання масиву для пошуку, чи мені потрібно робити щось подібне до мого рішення?

Відповіді:


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

або ANSI-сумісний:

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

ANYСинтаксис є кращим , оскільки масив в цілому може бути переданий в пов'язаної змінної:

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

Вам потрібно буде передати рядкове представлення масиву: {1,2}


1
Дякую, це працює! У підсумку я зробив: ".. some_id = ЛЮБО (ARRAY [". Implode (",", $ id_array). "])"
— Джиммі Піттс,

1
Привіт, SQL, вставте з наведеним коментарем ... (вбудуйте php у запит sql)
— сердитий 84

наступні повинні працювати краще: SELECT * FROM table WHERE some_id = ANY (unnest (? :: INT []))
— WhiteWolfza

1
@WhiteWolfza: чому, на вашу думку, це могло б працювати краще?
— Quassnoi

Здається, це не зберігає порядок повернення, визначений введенням масиву. тобто select id from users where id in (2, 1)і select id from users where id in (1, 2)завжди повертаються в тому ж порядку: 1, 2. Як повернути 2, 1за першим запитом?
— yiwen

3

Для використання динамічного SQL:

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

Приклад

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;

$$;

Результат: NOTICE: {1,2} NOTICE: SELECT * FROM my_table WHERE my_column IN(1,2)


я не думаю, що = IN - це правильний синтаксис
— FlavorScape

@FlavorScape, о, мій - виправлено! Althogh, він працював ідеально (часто я тестую приклад, який я публікую ...), але це, безумовно, виглядає краще без "="
— НЛО

точно не вдається з драйвером PostgreSQL
— FlavorScape


1

У моєму випадку мені потрібно було працювати зі стовпцем, що містить дані, тому використання IN () не спрацювало. Дякую @Quassnoi за його приклади. Ось моє рішення:

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

Я провів майже 6 годин, перш ніж натрапити на пост.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.