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

4

我有一个数据表,其中包含一列列表(为了简化本示例而减少到相关的列):

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
除非在TSQL 2008中有根本性的改变,否则它是一种蛮力方法。
select *
from table
where (    ( condition 1 OR condition 2)
    AND NOT ( condition 1 AND condition 2)    )

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

这将有效地按正确的优先级顺序排序记录,使我可以从列表中选择前面的一个。严格来说,它并没有实现“排他或”,但它可以应用于此数据集以达到相同的目的。

我会将其作为子查询来处理,但除此之外,“选择所有”,适当排序并选择前一个可能是(取决于表结构、行数和索引)完成此操作的最佳方法。 - Philip Kelley
在这种情况下,这是一个小规模的应用程序,面向半打用户,具有相当有限的数据集 - 可能不超过数万条记录,因此我认为这将是合适的。@Philip Kelley - BenAlabaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接