我必须访问一个相当混乱的postgresql数据库。一个表有三列:
PK [PK]Bigint| a_key [PK] text[] | a_val text[]
1, {name, job, age}, {'John', 'Eng', '31'}
2, {job, ID}, {'IT', '1234'}
3, {ID, age, name, BFF}, {'4321', '22', 'Piet', 'John'}
我正在尝试在python中使用一些sqlalchemy来根据键/值对内的值找到行的主键:
RETURN PK where name == 'John'
我可以获取所有具有“name”条目的行,然后在python中执行循环以查找“John”:
obj = session.query(table).filter(table.c.a_key.any(u'name')).all()
但我宁愿让数据库把它全部弄清楚,只返回'PK'。有什么想法吗?
答案 0 :(得分:0)
如果将列转换为数组,则可以查询unnest
,如下所示:
t=# create table so28 (pk int,a_key text[],a_val int[]);
CREATE TABLE
t=# insert into so28 select ^C
t=# create table so29 (pk int,a_key text[],a_val text[]); CREATE TABLE
t=# insert into so29 select 1,'{name, job, age}', $${'John', 'Eng', '31'}$$;
INSERT 0 1
t=# insert into so29 select 2,'{job, ID}', $${'IT', '1234'}$$;
INSERT 0 1
t=# insert into so29 select 3, '{ID, age, name, BFF}', $${'4321', '22', 'Piet', 'John'}$$;
INSERT 0 1
t=# with a as (select pk,unnest(a_key) k,unnest(a_val) v from so29)
select pk from a where k = 'name' and v = $$'John'$$;
pk
----
1
(1 row)