我目前正在使用以下声明。我怎么能用一个陈述来完成这个逻辑?
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
答案 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}}分支。
语义与完全相同,如果CASE
为PropertyValue
,则使用上述方法将其视为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条记录。多条记录会给你一个错误!