113

这是我正在尝试做的总结:

$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 中是否支持使用数组进行搜索,还是我必须做一些类似于我的解决方案的事情?

4

4 回答 4

206
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}

于 2012-05-24T13:28:33.970 回答
7

对于动态 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)

于 2017-03-23T09:09:28.700 回答
5

就我而言,我需要使用包含数据的列,因此使用 IN() 不起作用。感谢@Quassnoi 提供的示例。这是我的解决方案:

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

在我偶然发现这篇文章之前,我花了将近 6 个小时。

于 2020-09-21T13:45:44.200 回答
3
   $array[0] = 1;
   $array[2] = 2;
   $arrayTxt = implode( ',', $array);
   $sql = "SELECT * FROM table WHERE some_id in ($arrayTxt)"
于 2014-04-08T15:50:29.530 回答