如何将 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 数组作为字符串连接和查询到另一个表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组 id 引用到另一个集合

在线等。。。。SQL中如何将一个表中的某一列的数据替换到另一个表中的某一列里。

MYSQL 如何把查询到的结果插入到另一个表中?

怎样将数组作为Sql中IN的查询条件

MySQL如何将表作为子数组连接?

oracle中,查询结果去除重复列,插入到新表中