У меня есть такая таблица:

Roll    Name    Type
3       Mark    Ultimate Internet
1       Ana     Chase
4       June    Ultimate Internet
2       Badol   Chase

Как я могу сделать оператор SELECT, в котором я переименовываю столбец «Тип» в зависимости от значения? Что-то типа:

SELECT Roll, Name,
    IF Type = 'Ultimate Internet' AS 'ISP' END IF
    IF Type = 'Chase' AS 'Bank' END IF
FROM MyTable

Если Type = 'Ultimate Internet', результатом будет:

Roll    Name    ISP
3       Mark    Ultimate Internet
4       June    Ultimate Internet

Если Type = 'Chase', результатом будет:

Roll    Name    Bank
1       Ana     Chase
2       Badol   Chase
0
GTS Joe 4 Фев 2022 в 04:09
Вы можете перенести столбец Type в два столбца: ISP и Bank
 – 
a801a28cb4b6e70a
4 Фев 2022 в 05:34
SELECT Roll, Name, type as ISP, '' as Bank FROM MyTable where Type = 'Ultimate Internet' union all SELECT Roll, Name, '' as ISP, type as Bank FROM MyTable where Type = 'Chase'; не тестировалось, так как нет воспроизводимого примера
 – 
a801a28cb4b6e70a
4 Фев 2022 в 05:37
В качестве альтернативы вы можете сделать что-то вроде этого: SELECT Roll, Name, if type = 'Ultimate Internet' type else '' as ISP, if type = 'Chase' type else '' as Bank FROM MyTable
 – 
a801a28cb4b6e70a
4 Фев 2022 в 05:41
1
Контекст очень важен для динамических ситуаций SQL. Может ли ваше приложение обрабатывать имена столбцов (просто), может ли ваше приложение использовать функцию или процедуру PL/SQL, которая возвращает динамический курсор ссылки с правильными именами столбцов (немного сложно), или это нужно делать в один оператор SQL (возможно, но очень сложно)?
 – 
Jon Heller
4 Фев 2022 в 07:05

2 ответа

Нет, потому что имена столбцов должны быть известны во время компиляции.

У меня проблемы с пониманием того, что вы делаете. Вы используете Type как имя столбца и как переменную одновременно? Это на PL/SQL? Если это так, у вас может быть два разных курсора, но тогда вы не отображаете вывод таким образом. Если это чистый SQL, то откуда берется переменная?

0
eaolson 4 Фев 2022 в 06:18

Имена столбцов должны быть статическими. Вместо того, чтобы пытаться динамически построить один запрос, вы можете использовать два запроса:

SELECT Roll, Name, type AS ISP
FROM   MyTable
WHERE  type = 'Ultimate Internet'

А также:

SELECT Roll, Name, type AS bank
FROM   MyTable
WHERE  type = 'Chase'

Вы даже можете создать таблицу поиска со значениями типа:

CREATE TABLE types (
  type       VARCHAR2(20) PRIMARY KEY,
  super_type VARCHAR2(20)
);

INSERT INTO types (type, super_type)
SELECT 'Ultimate Internet', 'ISP'  FROM DUAL UNION ALL
SELECT 'Chase',             'bank' FROM DUAL;

А затем используйте:

SELECT m.Roll, m.Name, m.type AS ISP
FROM   MyTable m
       INNER JOIN types t
       ON (m.type = t.type)
WHERE  t.super_type = 'ISP'

Или

SELECT m.Roll, m.Name, m.type AS bank
FROM   MyTable m
       INNER JOIN types t
       ON (m.type = t.type)
WHERE  t.super_type = 'bank'
0
MT0 4 Фев 2022 в 12:52