SQL Server布尔表达式求值

7
我有一个表格,存储了县评估区的数据。我想添加一个计算列,告诉我这个房产是否为业主自住。我定义“业主自住”为真,如果该房产地址与业主地址相同,则为假。
由于县级来源数据中存在数据输入不准确性,如果我进行严格的文本比较,会得到很多错误的非业主自住结果。因此,我想测试“如果该物业的街道名称不在业主地址中,或者该物业的地址编号不在业主地址中,则这是一项非业主自住物业”。
我写了以下内容:
alter table appriasaldata add 
    IsOwnerOccupied as 
     case
        ((charindex(locastreetnumber, owneraddress) = 0) or (charindex(locastreetname, owneraddress) = 0))
        when TRUE THEN 1 ELSE 0
     end
SQL Server不喜欢CHARINDEX函数后面的等号。我该如何重写以使其可接受SQL Server?(我使用的是SQL Server 2005,如果有影响的话。)
4个回答

9

在SQL Server中,表达式不能返回true或false(没有布尔类型)。但是你可以将整个表达式移动到when语句内,例如:

alter table appriasaldata add 
    IsOwnerOccupied as 
     case when ((charindex(locastreetnumber, owneraddress) = 0) 
          or (charindex(locastreetname, owneraddress) = 0))
        THEN 1 ELSE 0
     end

2

您不能将布尔表达式放入CASE查找列表中。与C类型语言不同,在T-SQL中,布尔值不能与其他值进行比较。最后但并非最不重要的是,Transact-SQL没有TRUE和FALSE。

因此,您需要将布尔表达式移动到期望布尔值的CASE WHEN中:

alter table appriasaldata add 
    IsOwnerOccupied as 
     case when
        (charindex(locastreetnumber, owneraddress) = 0) 
       or (charindex(locastreetname, owneraddress) = 0)
         THEN 1 ELSE 0
     end

2

我想到的与Shannon Severance相同。

那段代码是一个适当的计算列。

使用这个简单的代码来测试这个想法:

DECLARE @appriasaldata TABLE (
    owneraddress        varchar(100),
    locastreetnumber    varchar(100),
    locastreetname      varchar(100)
)

INSERT INTO @appriasaldata (
    owneraddress,
    locastreetnumber,
    locastreetname
)
VALUES (
    '2701 SW Vaughn Street, Portland, OR',
    '2701',
    'SW Vaughn Street'
)

SELECT
    owneraddress,
    locastreetnumber,
    locastreetname,
    charindex(locastreetnumber, owneraddress),
    charindex(locastreetname,   owneraddress),
    CASE
        WHEN charindex(locastreetnumber, owneraddress) <> 0
          or charindex(locastreetname,   owneraddress) <> 0
        THEN 1
        ELSE 0
    END
FROM @appriasaldata

-1

试试这个:

SELECT
    owneraddress,
    locastreetnumber,
    locastreetname,
    charindex(locastreetnumber, owneraddress),
    charindex(locastreetname,   owneraddress),
    CASE
        WHEN charindex(locastreetnumber,
                       owneraddress)
            +charindex(locastreetname,
                       owneraddress)    > 0
        THEN 1
        ELSE 0
    END
FROM @appriasaldata

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