如何将 id 数组作为字符串连接和查询到另一个表中?
Posted
技术标签:
【中文标题】如何将 id 数组作为字符串连接和查询到另一个表中?【英文标题】:How do joins and query array of ids as a string into another table? 【发布时间】:2021-12-14 09:43:42 【问题描述】:我将多个 id 作为字符串存储在另一个表中。现在我需要加入id的表并查询加入的表
型号
user.rb
#columns
id:
name: string
# associations
has_one :user_store
store.rb
#columns
id:
name: string
user_store.rb
#columns
id: integer
user_id: integer
store_ids: string
#association
belongs_to :user
我将多个商店 id 存储在 user_store 的 store_ids 列中
示例 UserStore.first =>
#<UserStore:0x00005636e9ae7358
id: 1,
user_id: 1,
stores: "31, 32, 33, 34, 35",
created_at: Wed, 25 Aug 2021 19:24:37.292280000 UTC +00:00,
updated_at: Wed, 25 Aug 2021 19:24:37.292280000 UTC +00:00>
我如何从UserStore查询Store表?
Ruby - 3.0.1
Rails - 6.1.3.2
Postgres - 10
【问题讨论】:
"我将多个 id 作为字符串存储在另一个表中。" - 不要那样做。改为创建连接表以避免违反first normal form。这将使您可以简单地使用健全的查询连接表。 medium.com/pragmatic-programmers/… 【参考方案1】:您可以使用 Postgres 函数 string_to_array
将这个 "31,32,33,34,35"
字符串类型转换为数组类型,并使用 unnest
函数将数组元素转换为记录。
例如:
CREATE TABLE user_store (
id serial4 NOT NULL,
user_id int4 NOT NULL,
store_id int4 NOT NULL,
created_at timestamp NOT NULL,
updated_at timestamp NULL
);
CREATE OR REPLACE FUNCTION insert_user_store(p_user_id integer, p_store_id character varying)
RETURNS boolean
LANGUAGE plpgsql
AS $function$
begin
insert into user_store
(
user_id,
store_id,
created_at
)
select
p_user_id,
t1.store_ids::integer,
now()
from
unnest(string_to_array(p_store_id, ',')) t1 (store_ids);
return true;
exception
when others then
return false;
END;
$function$
;
调用此函数进行测试:
select * from test.insert_user_store(1, '31,32,33,34,35');
结果:
user_id | store_id | created_at |
---|---|---|
1 | 31 | 2021-11-01 07:31:22.351 |
1 | 32 | 2021-11-01 07:31:22.351 |
1 | 33 | 2021-11-01 07:31:22.351 |
1 | 34 | 2021-11-01 07:31:22.351 |
1 | 35 | 2021-11-01 07:31:22.351 |
【讨论】:
以上是关于如何将 id 数组作为字符串连接和查询到另一个表中?的主要内容,如果未能解决你的问题,请参考以下文章