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.