Postgresql选择column = array的行

Jim*_*tts 52 postgresql

这是我想要做的总结:

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

$sql = "SELECT * FROM table WHERE some_id = $array"
Run Code Online (Sandbox Code Playgroud)

显然有一些语法问题,但这就是我想要做的,而且我还没有发现任何显示如何做的事情.

目前,我的计划是按照以下方式做点什么:

foreach($idList as $is)
    $where .= 'some_id=' . $id . ' OR';
endforeach
$sql = "SELECT * FROM table WHERE " . $where;
Run Code Online (Sandbox Code Playgroud)

那么PostgreSQL中是否支持使用数组进行搜索,或者我是否必须执行与我的解决方案类似的操作?

Qua*_*noi 117

SELECT  *
FROM    table
WHERE   some_id = ANY(ARRAY[1, 2])
Run Code Online (Sandbox Code Playgroud)

ANSI兼容:

SELECT  *
FROM    table
WHERE   some_id IN (1, 2)
Run Code Online (Sandbox Code Playgroud)

ANY语法是首选,因为该阵列作为一个整体可在绑定的变量进行传递:

SELECT  *
FROM    table
WHERE   some_id = ANY(?::INT[])
Run Code Online (Sandbox Code Playgroud)

您需要传递数组的字符串表示形式: {1,2}

  • 你好 SQL 注入与上面的评论...(将 php 内爆到 SQL 查询中) (2认同)

Ufo*_*fos 5

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

$$;
Run Code Online (Sandbox Code Playgroud)

结果: NOTICE: {1,2} NOTICE: SELECT * FROM my_table WHERE my_column IN(1,2)


jki*_*ing 5

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

SELECT column(s) FROM table WHERE expr|column = ANY(STRING_TO_ARRAY(column,',')::INT[])
Run Code Online (Sandbox Code Playgroud)

我花了将近 6 个小时才偶然发现这个帖子。