我有一张表来存储县评估区的数据。我想添加一个计算列来告诉我该属性是否属于所有者。如果属性地址与所有者地址相同,我将“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.)
答案 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