我有一个postgres表,其中列类型是文本,但它的数据看起来像数组:
["97aa63c0-c562-11e3-b216-000180810a27","33fff220-b6be-11e3-be89-000180810a27"]
我的第一个问题是这个数据结构是什么?
如何在查询中匹配:例如:
如果表名称ID X和存在数据的列名是产品
Select * from X where product='97aa63c0-c562-11e3-b216-000180810a27'
我该怎么办?
答案 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;