Sql 如何获取动态列数?

Sql 如何获取动态列数?,sql,postgresql,Sql,Postgresql,有三个表存储PostgreSQL数据库中不同类型用户的信息。例如,内部用户表、公司客户表或身份不明用户表。正如您所看到的,表中列的数量和名称是不同的。我有一个用户ID列表。我需要在users表中检查它们。是否可以根据用户类型返回不同的选择?例如,如果在检查表users后发现该用户是内部用户,那么我想从internal\u users表返回数据。现在我必须使用CASE语句来检查每一列,这不是很有效。我曾想过将所有三个表合并成一个表,但列的数量会随着时间的推移而增加 这是项目内部用户的表格: cre

有三个表存储PostgreSQL数据库中不同类型用户的信息。例如,内部用户表、公司客户表或身份不明用户表。正如您所看到的,表中列的数量和名称是不同的。我有一个用户ID列表。我需要在
users
表中检查它们。是否可以根据用户类型返回不同的选择?例如,如果在检查表
users
后发现该用户是内部用户,那么我想从
internal\u users
表返回数据。现在我必须使用CASE语句来检查每一列,这不是很有效。我曾想过将所有三个表合并成一个表,但列的数量会随着时间的推移而增加

这是项目内部用户的表格:

create table internal_users (
    internal_user_id uuid not null default uuid_generate_v4() primary key,
    internal_user_first_name varchar not null,
    internal_user_last_name varchar not null,
    internal_user_middle_name varchar null,
    internal_user_primary_email email not null unique,
    internal_user_secondary_email email null unique,
    internal_user_primary_phone_number varchar not null unique,
    internal_user_secondary_phone_number varchar null unique,
    internal_user_profile_photo_url text null,
    internal_user_password text not null
);
create table company_clients (
    company_client_user_id uuid not null default uuid_generate_v4() primary key,
    company_client_first_name varchar null,
    company_client_last_name varchar null,
    company_client_middle_name varchar null,
    company_client_primary_email email null unique,
    company_client_secondary_email email null unique,
    company_client_primary_phone_number varchar null unique,
    company_client_secondary_phone_number varchar null unique,
    company_client_profile_photo_url text null,
    gender varchar not null,
    city varchar null,
    country varchar null,
    metadata json not null
);
create table unidentified_users (
    unidentified_user_id uuid not null default uuid_generate_v4() primary key,
    metadata json not null
);
这是项目公司客户的表格:

create table internal_users (
    internal_user_id uuid not null default uuid_generate_v4() primary key,
    internal_user_first_name varchar not null,
    internal_user_last_name varchar not null,
    internal_user_middle_name varchar null,
    internal_user_primary_email email not null unique,
    internal_user_secondary_email email null unique,
    internal_user_primary_phone_number varchar not null unique,
    internal_user_secondary_phone_number varchar null unique,
    internal_user_profile_photo_url text null,
    internal_user_password text not null
);
create table company_clients (
    company_client_user_id uuid not null default uuid_generate_v4() primary key,
    company_client_first_name varchar null,
    company_client_last_name varchar null,
    company_client_middle_name varchar null,
    company_client_primary_email email null unique,
    company_client_secondary_email email null unique,
    company_client_primary_phone_number varchar null unique,
    company_client_secondary_phone_number varchar null unique,
    company_client_profile_photo_url text null,
    gender varchar not null,
    city varchar null,
    country varchar null,
    metadata json not null
);
create table unidentified_users (
    unidentified_user_id uuid not null default uuid_generate_v4() primary key,
    metadata json not null
);
这是该项目的身份不明用户的表:

create table internal_users (
    internal_user_id uuid not null default uuid_generate_v4() primary key,
    internal_user_first_name varchar not null,
    internal_user_last_name varchar not null,
    internal_user_middle_name varchar null,
    internal_user_primary_email email not null unique,
    internal_user_secondary_email email null unique,
    internal_user_primary_phone_number varchar not null unique,
    internal_user_secondary_phone_number varchar null unique,
    internal_user_profile_photo_url text null,
    internal_user_password text not null
);
create table company_clients (
    company_client_user_id uuid not null default uuid_generate_v4() primary key,
    company_client_first_name varchar null,
    company_client_last_name varchar null,
    company_client_middle_name varchar null,
    company_client_primary_email email null unique,
    company_client_secondary_email email null unique,
    company_client_primary_phone_number varchar null unique,
    company_client_secondary_phone_number varchar null unique,
    company_client_profile_photo_url text null,
    gender varchar not null,
    city varchar null,
    country varchar null,
    metadata json not null
);
create table unidentified_users (
    unidentified_user_id uuid not null default uuid_generate_v4() primary key,
    metadata json not null
);
存储有关用户所属用户类型的信息的全局表:

create table users (
    user_id uuid not null default uuid_generate_v4() primary key,
    internal_user_id uuid null,
    foreign key (internal_user_id) references internal_users (internal_user_id),
    company_client_id uuid null,
    foreign key (company_client_id) references company_clients (company_client_id),
    unidentified_user_id uuid null,
    foreign key (unidentified_user_id) references unidentified_users (unidentified_user_id)
);

有可能在不同的表中有相同的用户吗?不,那是不可能的。从逻辑上讲,一个用户不能同时在多个表中。但是,身份不明的用户最终可能会出现在
公司客户
表中。理论上,您只能将
company\u客户端
未识别用户
表组合在一起。您有什么想法吗?使用左连接获取所有数据,然后在代码中处理这些情况可能会更快