【问题标题】:How do I achieve exclusive OR in T-SQL?如何在 T-SQL 中实现异或?
【发布时间】:2011-09-20 10:33:08
【问题描述】:

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

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,
  ...,
)

我希望从这张表中获取所有记录:

  • 帐户属于指定用户
  • 首先:
    • 帐户处于活动状态并且今天的日期介于帐户的生效日期和到期日期之间
  • 在第二种情况下:
    • 如果一审未发现任何记录,则以最近到期日的记录为准。

所以 - 如果存在今天的日期介于帐户的生效日期和到期日期之间的活动记录,我想要该记录。仅当未找到匹配项时,我才希望该用户的任何帐户具有最近的到期日期。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      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 在这种情况下,它是一个适用于六个用户的小型应用程序,数据集相当有限 - 外部可能不超过数万条记录,所以我认为这将是合适。
      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多