如何使用SQL

时间:2018-09-17 05:27:20

标签: 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的形式打印 所以,你能帮我吗?

3 个答案:

答案 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   

在线示例:http://rextester.com/RCKB51862