如何在T-SQL中实现异或?

时间:2011-06-22 14:07:46

标签: tsql sql-server-2008 sql-server-2008-r2

我有一个数据表,其中有一个列列表(在本例中归结为相关的列):

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 个答案:

答案 0 :(得分:5)

除非在TSQL 2008中发生了根本性的变化,否则这是一种蛮力。

select *
from table
where (    ( condition 1 OR condition 2)
    AND NOT ( condition 1 AND condition 2)    )

答案 1 :(得分:4)

这是我找到的一个解决方案:

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

这将有效地按正确的优先顺序排列记录,允许我从列表中选择最顶层的

严格地说,它没有实现独占或,但它可以应用于此数据集以实现相同目的。