我是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的形式打印 所以,你能帮我吗?
答案 0 :(得分:1)
SQL客户端通常为您提供列名和行值并格式化结果的格式。 pgAdmin并非真的适合于此,编程语言会更好。
例如,这是使用Ruby和ruby-pg gem的方式。
#!/usr/bin/env ruby
require 'pg'
conn = PG.connect( dbname: 'test' )
conn.exec( "SELECT * FROM tableA" ) do |result|
result.each do |row|
row.each do |column,value|
puts "#{column} = #{value}"
end
end
end
答案 1 :(得分:1)
您可以对查询进行合并,一次只选择一列
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),以使其正常工作。
答案 2 :(得分:0)
另一种选择是创建一个可根据需要返回结果的函数:
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