SQL Server - 使用SELECT CASE WHEN设置位变量,但如果SELECT没有返回记录,则默认为0

时间:2017-02-04 06:27:20

标签: sql sql-server

我目前正在使用以下声明。我怎么能用一个陈述来完成这个逻辑?

DECLARE @DisableCSDSync BIT

SET @DisableCSDSync = (SELECT 
                           CASE WHEN PropertyValue = 'true' 
                              THEN 1 
                              ELSE 0 
                           END 
                       FROM MyTable WITH (NOLOCK) 
                       WHERE Property = 'DisableSync' AND ParentId = 61040)

IF @DisableCSDSync IS NULL 
    SET @DisableCSDSync = 0

4 个答案:

答案 0 :(得分:1)

您可以在声明变量时设置默认值,以便变量将具有默认值,以防您的选择查询没有提取任何行。另外,在select语句中设置值,以防止在没有要提取的行的情况下将值变为null:

import { Component } from '@angular/core';
import { TestBed, async } from '@angular/core/testing';

import { fetchComponent} from './fetchdata.component';



describe('EchoPipe', () => {
    let comp: fetchComponent;
    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [fetchComponent]
        })
        .compileComponents(); 
    }));

    //beforeEach(async(() => {
    //    TestBed.compileComponents();
    //}));

    it('works well', async(() => {
        const fixture = TestBed.createComponent(fetchComponent);
        comp = fixture.componentInstance;
        fixture.detectChanges();
        // const el = fixture.debugElement.nativeElement as HTMLElement;
        expect(comp.currentCount).toEqual(0);
    }));

    it("can have more than one expectation", function () {
        var foo = 0;
        foo += 1;

        expect(foo).toEqual(1);
        expect(true).toEqual(true);
    });

});

答案 1 :(得分:1)

即使select不返回记录,此查询也会为您提供预期的输出

DECLARE @DisableCSDSync BIT

SET @DisableCSDSync = ISNULL((SELECT CASE
                                       WHEN PropertyValue = 'true' THEN 1
                                       ELSE 0
                                     END
                              FROM   MyTable WITH (NOLOCK)
                              WHERE  Property = 'DisableSync'
                                     AND ParentId = 61040), 0) 

答案 2 :(得分:0)

您还可以使用以下

DECLARE @DisableCSDSync BIT = ISNULL(TRY_CAST((
                   SELECT PropertyValue
                   FROM   MyTable WITH (NOLOCK)
                   WHERE  Property = 'DisableSync'
                          AND ParentId = 61040) AS BIT), 0);

它使用相同的ISNULL方法作为处理零行情况的其他答案之一,但也使用相同的ISNULL(与TRY_CAST .. AS BIT一起)来处理ELSE的{​​{1}}分支。

语义与完全相同,如果CASEPropertyValue,则使用上述方法将其视为1,但可能它们很接近够了。

答案 3 :(得分:0)

DECLARE @DisableCSDSync BIT

设置@DisableCSDSync = isnull( (选择最大值(CASE WHEN PropertyValue =' true' THEN 1 ELSE 0 END) 来自MyTable WITH(NOLOCK) 属性=' DisableSync' AND ParentId = 61040) ,0)

当您没有收到任何记录时,Isnull将授予默认值0。 最大值将确保您只收到1条记录。多条记录会给你一个错误!