2009-09-15 16 views
5

Mam tabelę, która przechowuje dane z okręgu oceny hrabstwa. Chcę dodać kolumnę obliczeniową, aby powiedzieć mi, czy nieruchomość jest zajęta przez właściciela. Definiuję "właściciela zajętego" jako prawdę, jeśli adres własności jest taki sam jak adres właściciela, w przeciwnym razie false.Ocena Boolean SQL Server

Z powodu niedokładności wprowadzania danych w danych źródłowych z hrabstwa, jeśli dokonam dokładnego porównania tekstu, otrzymuję wiele fałszywych wyników niezwiązanych z właścicielem. Chcę przetestować "Jeśli nazwa ulicy nieruchomości nie znajduje się na adresie właściciela, lub jeśli numer adresu nieruchomości nie jest pod adresem właściciela, oznacza to, że nie jest to własność zajmowana przez właściciela"

Napisałem poniżej :

 
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 nie lubi znaków = po funkcjach CHARINDEX. Jak mogę przepisać to, aby było możliwe do zaakceptowania przez SQL Server? (Używam programu SQL Server 2005, jeśli ma to znaczenie.)

Odpowiedz

8

Wyrażenia nie mogą zwracać wartości true lub false w SQL Server. (Brak typu Boolean), ale można przejść całą ekspresję wewnątrz when lubię:

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

nie można umieścić logiczną wyraz w liście przypadek wyszukiwania. W przeciwieństwie do języków typu C, w T-SQL nie można porównać wartości boolowskiej z innymi wartościami. I wreszcie Transact-SQL nie ma wartości TRUE i FALSE.

Więc trzeba przenieść logiczną ekspresję w przypadku WHEN, który expectes wartość logiczną:

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

wymyśliłem samo jak Shannon Severance.

Ten kod jest prawidłową kolumną obliczeniową.

Test pomysł z tego prostego kodu:

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

Spróbuj tego:

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