SQL: запрос 2 столбцов; если один действителен, тогда игнорируйте другой - PullRequest
1 голос
/ 11 марта 2010

Я не уверен, как подойти к этому оператору SQL, поэтому, пожалуйста, сообщите, даже если это просто указатель на что-то, что я могу прочитать на

У меня есть таблица, такая как следующая

ID        OVER60      OVER80
1          N           N
2          Y           N
3          Y           Y

Идентификаторы уникальны, мне нужно создать оператор SELECT, который будет возвращать идентификатор, а затем либо «Более 60», либо «Более 80», например:

ID        AGE
2         Over 60
3         Over 80

Чего мне следует избегать, так это дубликатов, то есть, если у кого-то более 80, нет необходимости отображать «более 60», поскольку это довольно очевидно

Я посмотрел на UNION, чтобы посмотреть, поможет ли это, и это то, что я имею до сих пор:

  SELECT 
    a.id,
    'OVER60' as AGE
  FROM
    MY_TABLE a
  WHERE
    a.OVER_60 != 'N'
UNION
  SELECT 
    a.id,
    'OVER80' as AGE
  FROM
    MY_TABLE a
  WHERE
    a.OVER_80 != 'N'

    ;

Какие у меня варианты? поможет ли здесь использование MINUS?

Спасибо

Ответы [ 3 ]

3 голосов
/ 11 марта 2010

Вы можете использовать для этого СЛУЧАЙНОЕ ЗАЯВЛЕНИЕ .

Что-то ике

SELECT a.ID,
        CASE    
            WHEN a.OVER_80 = 'Y' THEN 'OVER80'
            WHEN a.OVER_60 = 'Y' THEN 'OVER60'
        END
FROM    MY_TABLE
WHERE   a.OVER_60 = 'Y'
1 голос
/ 11 марта 2010

Правильный способ сделать это, если вы хотите хорошо масштабировать, - это перестроить ваш стол. Отдельные функции, такие как case и coalesce, не масштабируются.

Не храните в базе данных, старше 60 или 80 лет. Для начала, это переменная вещь, которая меняется с течением времени. Сохраните их дату рождения, которая является инвариантом.

Затем просто запустите:

select a.id, 'over 60' from my_table
    where birthdate < now() - 60 years
    and   birthdate >= now() - 80 years
union all select a.id, 'over 80' from my_table
    where birthdate < now() - 80 years;

С индексом на дату рождения, который должен прокричать, потому что, если СУБД не является мозговой смертью, now() - N years будет вычисляться только один раз .

1 голос
/ 11 марта 2010

CASE, IF, COALESCE - здесь возможны различные подходы. Многое зависит от того, какой сервер базы данных вы используете;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...