如何使用SQL从数据库中获取键值对

如何使用SQL从数据库中获取键值对,sql,postgresql,Sql,Postgresql,我是SQL新手,您能帮我弄清楚如何从SQL中获取键值对吗 例如:表A A(PK) B(INT) C D ------ ------- ------- -------- 1 X Y Z 2 A B C 我想要表单中的输出 A = 1 B = X C = Y D = Z 我试过了 SELECT A,B,C,D from tableA ; 但它只以1 X Y Z的形式打印 那么,您能帮我

我是SQL新手,您能帮我弄清楚如何从SQL中获取键值对吗 例如:表A

A(PK)    B(INT)  C       D
------ ------- ------- --------

1        X       Y        Z

2        A       B        C
我想要表单中的输出

A = 1
B = X 
C = Y 
D = Z
我试过了

SELECT A,B,C,D from tableA ; 
但它只以1 X Y Z的形式打印
那么,您能帮我吗?

通常,SQL客户机会为您提供列名、行值和结果格式。pgAdmin并不真正适合这种情况,编程语言会更好

例如,下面是使用Ruby和


通常,SQL客户机为您提供了获取列名、行值和格式化结果的功能。pgAdmin并不真正适合这种情况,编程语言会更好

例如,下面是使用Ruby和


您可以一次合并一列查询

SELECT 'A', A from tableA WHERE ID = @ID
UNION
SELECT 'B', B from tableA WHERE ID = @ID
UNION
SELECT 'C', C from tableA WHERE ID = @ID
UNION
SELECT 'D', D from tableA WHERE ID = @ID

您可能需要将所有列强制转换为公共类型(varchar)才能正常工作。

您可以一次合并一列查询

SELECT 'A', A from tableA WHERE ID = @ID
UNION
SELECT 'B', B from tableA WHERE ID = @ID
UNION
SELECT 'C', C from tableA WHERE ID = @ID
UNION
SELECT 'D', D from tableA WHERE ID = @ID

您可能需要将所有列强制转换为公共类型(varchar)才能正常工作。

另一个选项是创建一个按需返回结果的函数:

create type crosstab_type as (row_num bigint, column_name text, value text);

create or replace function kv()
  returns setof crosstab_type
as
$$
declare 
  l_rec record;
  l_row bigint := 1;
begin
  for l_rec in select * from ani 
  loop
    return next (l_row, 'a', l_rec.a::text)::crosstab_type;
    return next (l_row, 'b', l_rec.b::text)::crosstab_type;
    return next (l_row, 'c', l_rec.c::text)::crosstab_type;
    return next (l_row, 'd', l_rec.d::text)::crosstab_type;
    l_row := l_row + 1;
  end loop;
end;
$$
language plpgsql;



select *
from kv();
返回:

row_num | column_name | value
--------+-------------+------
1 | a | 1
1 | b | X
1 | c | Y
1 | d | Z
2 | a | 2
2 | b | A
2 | c | B
2 | d | C

联机示例:

另一个选项是创建一个按需返回结果的函数:

create type crosstab_type as (row_num bigint, column_name text, value text);

create or replace function kv()
  returns setof crosstab_type
as
$$
declare 
  l_rec record;
  l_row bigint := 1;
begin
  for l_rec in select * from ani 
  loop
    return next (l_row, 'a', l_rec.a::text)::crosstab_type;
    return next (l_row, 'b', l_rec.b::text)::crosstab_type;
    return next (l_row, 'c', l_rec.c::text)::crosstab_type;
    return next (l_row, 'd', l_rec.d::text)::crosstab_type;
    l_row := l_row + 1;
  end loop;
end;
$$
language plpgsql;



select *
from kv();
返回:

row_num | column_name | value
--------+-------------+------
1 | a | 1
1 | b | X
1 | c | Y
1 | d | Z
2 | a | 2
2 | b | A
2 | c | B
2 | d | C


在线示例:

您是否只需要一张记录的密钥?是否有定义顺序的列?是的,这将是一个单一的结果查询。通常,SQL客户机为您提供获取列名和行值的功能。您使用的是什么SQL客户端?我使用的是pgadmin 4,那么多行呢?那么JSON结果呢?你只想要一张唱片的钥匙吗?是否有定义顺序的列?是的,这将是一个单一的结果查询。通常,SQL客户机为您提供获取列名和行值的功能。您使用的是什么SQL客户端?我使用的是pgadmin 4,那么多行呢?那么JSON结果呢?在java中可能吗?@Ani是的,几乎任何编程语言都可以连接到Postgres。我不懂Java,但这可能会有所帮助。我使用JSON和java来完成这个答案,虽然我没有使用ruby作为语言,但想法几乎是一样的TNX在java中可能吗?@Ani是的,几乎任何编程语言都可以连接到Postgres。我不懂Java,但这可能会有所帮助。我使用JSON和java来完成这个答案,虽然我没有使用ruby作为语言,但想法几乎是一样的TnxI补充说,只是为了确保一个记录,Ani没有指定使用哪一个子句。我在这里组合了两个答案,我尝试了你的答案,但暂时不起作用,但是上面的两个答案(一个作为回复)我尝试作为JSON对象,然后使用JAVAI解析它。我补充说,为了确保一条记录,Ani没有指定使用哪个子句。我在这里组合了两个答案,我尝试了you answer,但暂时不起作用,但上面的两个答案(一个作为reply)我尝试作为JSON对象,然后使用JAVA解析