Postgres匹配字符串数组中的数据

时间:2014-07-29 22:01:57

标签: postgresql

我有一个postgres表,其中列类型是文本,但它的数据看起来像数组:

["97aa63c0-c562-11e3-b216-000180810a27","33fff220-b6be-11e3-be89-000180810a27"]

我的第一个问题是这个数据结构是什么?

如何在查询中匹配:例如:

如果表名称ID X和存在数据的列名是产品

Select * from X where product='97aa63c0-c562-11e3-b216-000180810a27'

我该怎么办?

1 个答案:

答案 0 :(得分:2)

它看起来像一个包含uuid值的json或python数组文字。

many reasons not to store data like this,但听起来你没有设计数据库。

在现代的PostgreSQL中,我将其解析为json。在旧版本中,我使用字符串函数进行转换。在9.4中,这将起作用:

WITH arr(uuids) AS (
  VALUES('["97aa63c0-c562-11e3-b216-000180810a27","33fff220-b6be-11e3-be89-000180810a27"]')
)
SELECT 
  elem::uuid
FROM arr, json_array_elements_text(
  uuids::json
) elem;

但9.3没有json_array_elements_text所以你必须写:

WITH arr(uuids) AS (VALUES('["97aa63c0-c562-11e3-b216-000180810a27","33fff220-b6be-11e3-be89-000180810a27"]'))
SELECT json_array_element(uuids::json, ss-1) FROM arr, generate_series( 1, json_array_length(uuids::json) ) ss;

以及更旧的版本:

WITH arr(uuids) AS (VALUES('["97aa63c0-c562-11e3-b216-000180810a27","33fff220-b6be-11e3-be89-000180810a27"]'))
    SELECT left(right(elem,-1),-1)::uuid FROM arr, unnest(string_to_array(left(right(uuids, -1),-1), ',')) elem;