2009-09-15 136 views
5

我有一張存儲來自縣評估區的數據的表。我想添加一個計算列來告訴我該屬性是否爲擁有者。如果物業地址與業主地址相同,則將「業主佔用」定義爲true,否則爲false。SQL Server布爾表達式評估

由於數據錄入來自縣的源數據不準確,如果我做了嚴格的文本比較,我會得到很多錯誤的非所有者佔有的結果。所以我想測試「如果該物業的街道名稱不在所有者的地址,或者如果該物業的地址號碼不在業主的地址,那麼這是一個非業主佔用的財產」

我寫了以下內容:

 
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)。

回答

8

表達式在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

你不能把在的情況下查找列表布爾表達式。與C語言不同,在T-SQL中,布爾值不能與其他值進行比較。最後但並非最不重要的Transact-SQL沒有TRUE和FALSE。

所以,你需要布爾表達式進入的情況下WHEN,其中expectes一個布爾值:

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

我想出了同樣的事情,香遣散。

該代碼是一個適當的計算列。

測試這個簡單的代碼的想法:

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