SQL, как найти ненулевой столбец? - PullRequest
5 голосов
/ 26 августа 2009

У меня есть таблица с большим количеством столбцов, скажем, у меня есть столбцы

A, B, C, D

в каждом из этих столбцов будет заполнен только один столбец в любой записи, а остальные всегда будут NULL.

Мне нужен оператор выбора, который будет возвращать столбец ненулевого столбца.

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

Кто-нибудь знает самый простой способ сделать это?

Ответы [ 5 ]

8 голосов
/ 26 августа 2009
SELECT
    CASE
        WHEN A IS NOT NULL THEN 'A'
        WHEN B IS NOT NULL THEN 'B'
        WHEN C IS NOT NULL THEN 'C'
        WHEN D IS NOT NULL THEN 'D'
    END
FROM
    MyTable
4 голосов
/ 26 августа 2009

Попробуйте кейс ...

SELECT
CASE WHEN A IS NOT NULL THEN 'A' WHEN B IS NOT NULL THEN 'B' WHEN C IS NOT NULL THEN 'C' WHEN D IS NOT NULL THEN 'D' END as NotNullCol, OtherCols
FROM YourTable
3 голосов
/ 26 августа 2009

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

Почти наверняка было бы проще разделить A, B, C и D на отдельные строки в отдельной таблице, привязать их обратно к строке в исходной таблице и создать запрос JOIN -типа.

В качестве альтернативы, если только один из них не равен NULL, я бы выбрал два столбца: тип (A, B, C или D) и значение. Тогда вы не тратите впустую столбцы в каждой строке, и запросы становятся неизмеримо проще (при условии, что типы одинаковы).

Однако, вы можете сделать это с помощью case:

select case
    when A is not null then 'A'
    when B is not null then 'B'
    when C is not null then 'C'
    else                    'D'
    end
from ...

Синтаксис может быть не совсем правильным, вам нужно его найти. Обычно это не то, чем я занимаюсь, так как считаю это плохой идеей (функции для отдельных строк в select никогда хорошо не масштабируются).

2 голосов
/ 26 августа 2009

Не красиво, но это делает то, что вы хотите:

select case 
    when a is not null then 'a' 
    when b is not null then 'b' 
    when c is not null then 'c' 
    when d is not null then 'd' 
end
0 голосов
/ 26 августа 2009

Я бы изменил дизайн. Оказывается, почти всегда плохая идея хранить данные таким образом, а не в связанной таблице.

В связанной таблице вы можете легко запросить информацию. Вы также можете легче наложить ограничение на данные, так как разрешена только одна запись, так что у вас, вероятно, будет лучшая целостность данных.

Меньшее количество таблиц не обязательно означает более быстрый доступ или лучший дизайн в реляционных базах данных. Относительно разработанные и проиндексированные связанные таблицы обычно довольно хороши. И хотя вы можете подумать, что вам никогда не понадобится пятая колонна, бизнес-правила меняются, и я видел много вещей, которые, по мнению людей, не нуждаются в расширении, которые, как оказалось, требуют масштабируемости.

...