PostgreSQL选择列=数组的行


77

这是我正在尝试做的摘要:

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

Answers:


153
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 = ANY(ARRAY [“。implode(”,“,$ id_array)。”])“
Jimmy Pitts

1
您好,SQL注入了以上注释...(将php插入到SQL查询中)
生气

以下应该会更好地工作: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,它确实运行得很好(ofc,我测试了我发布的示例...),但是如果没有“ =
Ufos 17-10-23

PostgreSQL驱动程序肯定会失败
FlavorScape

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

1
您还需要检查输入数据:$ nums = array(); foreach($ array as $ a)if(is_numeric($ a))$ nums [] = $ a;
peschanko

1

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

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

我花了将近6个小时才迷失了职位。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.