Как мне добиться эксклюзивного ИЛИ в T-SQL? - PullRequest
4 голосов
/ 22 июня 2011

У меня есть таблица данных, в которой есть список столбцов (для данного примера сводятся к соответствующим):

users(
  usr_pkey int identity(1, 1) primary key,
  usr_name nvarchar(64),
  ...,
)

accounts(
  acc_pkey int identity(1, 1) primary key,
  usr_key int foreign_key references users(usr_pkey),
  acc_effective datetime,
  acc_expires datetime,
  acc_active bit,
  ...,
)

Из этой таблицы я ищу все записи, где:

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

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

Ответы [ 2 ]

5 голосов
/ 22 июня 2011

Если что-то радикально не изменилось в TSQL 2008, это грубая сила.

select *
from table
where (    ( condition 1 OR condition 2)
    AND NOT ( condition 1 AND condition 2)    )
4 голосов
/ 22 июня 2011

Вот одно решение, которое я нашел:

select top 1 *
from accounts
where usr_key = @specified_user
order by
  acc_active desc,
  case 
    when getdate() between acc_effective and acc_expires then 0
    else 1
  end,
  acc_expires desc

Это позволит эффективно упорядочить записи в правильной последовательности приоритетов, что позволит мне выбрать первое из списка

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

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