Postgres SQL在特定元素中查询数组文本[]

Emr*_*dov 7 sql arrays postgresql

这是我要查询的数据:表名:"test",列"data"

7;"{{Hello,50},{Wazaa,90}}"
8;"{{Hello,50},{"Dobar Den",15}}"
Run Code Online (Sandbox Code Playgroud)

要查询此数据,我正在使用此SQL查询:

SELECT *, pg_column_size(data) FROM test WHERE data[1][1] = 'Hello'
Run Code Online (Sandbox Code Playgroud)

我如何搜索所有元素,但在第一个子元素中而不是在第二个元素中,例如:

SELECT *, pg_column_size(data) FROM test WHERE data[][1] = 'Hello'
Run Code Online (Sandbox Code Playgroud)

因为如果我这样搜索:

SELECT *, pg_column_size(data) FROM test WHERE data[1][1] = "Wazaa"
Run Code Online (Sandbox Code Playgroud)

它不会返回任何东西,因为我很难查看第一个子元素,我必须像这样修改它:

SELECT *, pg_column_size(data) FROM test WHERE data[2][1] = 'Wazaa'
Run Code Online (Sandbox Code Playgroud)

如何使它检查所有父元素和第一个子元素?

有一个解决方案使用"ANY"查询所有元素,但我不想触摸where语句中的第二个元素,因为如果我在第一个子元素中有数字,它将查询第二个参数,它也是数字.

SELECT * FROM test WHERE '90' = ANY (data);
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 2

PostgreSQL对数组的支持不是特别好。一维数组很容易unnest,但 n 维数组是完全扁平化的,而不仅仅是第一维。不过,您可以使用这种方法来查找所需的记录集,但它相当难看:

SELECT test.*, pg_column_size(test.data) AS column_size
FROM test
JOIN (SELECT id, unnest(data) AS strings FROM test) AS id_strings USING (id)
WHERE id_strings.strings = 'Wazaa';
Run Code Online (Sandbox Code Playgroud)

或者,编写此函数将二维数组减少为一维数组的记录,然后您基本上可以使用问题中的所有 SQL 查询。

  • 我们今天所知的大多数数据库都是[关系](https://en.wikipedia.org/wiki/Relational_model)。这使得它们本质上不适合数组等顺序数据结构。一般来说,我们会建议您以不需要数组的方式更改数据模型。 (2认同)
  • @Patrick:实际上我认为在关系数据库领域,Postgres 的数组支持非常好——我所知道的其他 DBMS 都没有提供这种灵活性。与任何功能一样:您始终可以改进它。不过,数组对于特定问题是否是一个好的选择是一个完全不同的话题。 (2认同)