SQL Server布尔表达式评估

时间:2009-09-15 20:57:57

标签: sql sql-server sql-server-2005 tsql

我有一张表来存储县评估区的数据。我想添加一个计算列来告诉我该属性是否属于所有者。如果属性地址与所有者地址相同,我将“owner occupied”定义为true,否则为false。

由于来自县的源数据中的数据输入不准确,如果我进行严格的文本比较,我会得到很多错误的非自住占用结果。所以我想测试“如果房产的街道名称不在房主的地址中,或者房产的地址编号不在房主的地址中,那么这是一个非房东占用的房产”

我写了以下内容:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您不能将布尔表达式放在案例查找列表中。与C类型语言不同,在T-SQL中,无法将布尔值与其他值进行比较。最后但并非最不重要的是,Transact-SQL没有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 :(得分: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

答案 3 :(得分:-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