没有“灵活”的解决方案,除非您打算使用动态 SQL 来获取每个值(这可能会严重降低性能)。
你可以使用CASE:
CASE column_name
WHEN 'FIELD1' THEN field1
WHEN 'FIELD2' THEN field2
WHEN 'FIELD3' THEN field3
ELSE 'default'
END AS field_value
或DECODE:
DECODE( column_name, 'FIELD1', field1, 'FIELD2', field2, 'FIELD3', field3, 'default' )
AS field_value
或通过取消旋转表格。但是,如果您更改列数,所有这些解决方案都需要更新。
重构表格的另一种方法:
CREATE TABLE field_values (
id INT,
field_name VARCHAR2(20),
field_value VARCHAR2(20),
CONSTRAINT field_values__id_fn__pk PRIMARY KEY ( id, field_name )
);
CREATE TABLE ids (
id INT PRIMARY KEY,
column_name VARCHAR2(20),
CONSTRAINT ids__id_cn__fk FOREIGN KEY ( id, column_name )
REFERENCES field_names ( id, field_name )
);
INSERT INTO field_names
SELECT 1, 'FIELD1', 'red' FROM DUAL UNION ALL
SELECT 1, 'FIELD2', 'blue' FROM DUAL UNION ALL
SELECT 1, 'FIELD3', 'yellow' FROM DUAL UNION ALL
SELECT 2, 'FIELD1', 'black' FROM DUAL UNION ALL
SELECT 2, 'FIELD2', 'purple' FROM DUAL UNION ALL
SELECT 2, 'FIELD3', 'green' FROM DUAL UNION ALL
SELECT 3, 'FIELD1', 'grey' FROM DUAL UNION ALL
SELECT 3, 'FIELD2', 'brown' FROM DUAL UNION ALL
SELECT 3, 'FIELD3', 'white' FROM DUAL;
INSERT INTO ids
SELECT 1, 'FIELD1' FROM DUAL UNION ALL
SELECT 2, 'FIELD3' FROM DUAL UNION ALL
SELECT 3, 'FIELD2' FROM DUAL;
SELECT i.id,
i.column_name,
f.field_value
FROM ids i
INNER JOIN field_values f
ON ( i.id = f.id AND i.column_name = f.field_name );