使用 Exists 或 Select 将此值设置为位变量哪个更好?

Posted

技术标签:

【中文标题】使用 Exists 或 Select 将此值设置为位变量哪个更好?【英文标题】:What is better to use Exists or Select to set this value to bit variable? 【发布时间】:2014-11-28 09:51:22 【问题描述】:

我有指示行是否存在的位(或整数)变量。

是的,我知道最好只检查EXISTS,但目前我需要将它的值设置为我的变量。

所以问题:使用SELECTEXISTS 哪个更好

DECLARE @signoff int    
set @signoff = 0


Set @signoff = (SELECT TOP 1
    AccountsOperations_ID
    FROM AccountsOperations
    WHERE Operation_ID = 3 and Submission_ID = @SubmissionID and AccountDate is null)

然后检查

if @signoff is null or @signoff = 0

DECLARE @signoff bit
    set @signoff = 0

Set @signoff = SELECT CAST(
   CASE WHEN EXISTS(SELECT TOP 1
             AccountsOperations_ID
             FROM AccountsOperations
             WHERE Operation_ID = 3 and Submission_ID = @SubmissionID and AccountDate is null) 
       THEN 1 
   ELSE 
        0 
   END 
AS BIT)

【问题讨论】:

在第二个例子中,你在哪里设置变量的值?您只是为其设置 1 或 0。 因为BIT只有2个可能的值 我以为您想要变量中的 AccountOperations_ID 的值。检查你在做什么是不正确的。但是,如果您只是希望您的变量成为一个标志,那么您应该考虑将其默认为 0,然后将 IF EXISTS 子句设置为 1。这将是最好的方法。 【参考方案1】:

对我来说,应该是这样的:

DECLARE @signoff bit
    set @signoff = 0

Set @signoff = SELECT CAST(
   CASE WHEN EXISTS(SELECT 1
             FROM AccountsOperations
             WHERE Operation_ID = 3 and Submission_ID = @SubmissionID and AccountDate is null) 
       THEN 1 
   ELSE 
        0 
   END 
AS BIT)

你根本不需要顶部,它可能会给查询带来额外的工作。

【讨论】:

【参考方案2】:

添加到评论中:

DECLARE @signoff bit
    set @signoff = 0

IF EXISTS(SELECT 1
             FROM AccountsOperations
             WHERE Operation_ID = 3 and Submission_ID = @SubmissionID and AccountDate is null) 

SELECT @signoff = 1

您不需要 TOPELSE,因为无论如何您都将其默认为 0。

【讨论】:

【参考方案3】:

使用IF EXISTS 可以做到这一点,如果行存在则返回true,否则返回false。

    DECLARE @signoff bit


    IF EXISTS
    (
    SELECT 1
           AccountsOperations_ID
    FROM   AccountsOperations
    WHERE  Operation_ID = 3 and Submission_ID = @SubmissionID and AccountDate is null
    ) 
    SET signoff = 1 -- row exists
    ELSE
    SET signoff = 0 -- row doesn't exists

【讨论】:

以上是关于使用 Exists 或 Select 将此值设置为位变量哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章

Mongoid 按值或默认值查询

我通过蓝牙向 arduino nano ble 33 发送了一个值,并收到了树莓派的值。如何将此值转换为数字?

如何使用 moment.js 将此值 theHour[0].times 更改为时间格式 (HH:mm)

如何将此代码转换为准备好的语句或 jdbc 中的语句? [关闭]

我如何将此值存储到数据库中[关闭]

Vue-Select:如何将此 fetch() 代码转换为使用 axios?