2009-09-15 15 views
5

Tengo una tabla que almacena datos del distrito de tasación del condado. Quiero agregar una columna calculada para decirme si la propiedad está ocupada por el propietario. Defino "propietario ocupado" como verdadero si la dirección de la propiedad es la misma que la dirección del propietario, de lo contrario es falso.SQL Server Boolean Evaluación de evaluación

Debido a las inexactitudes en la entrada de datos del condado, si hago una comparación de texto estricta obtengo una gran cantidad de resultados falsos no ocupados por el propietario. Entonces quiero probar "Si el nombre de la calle de la propiedad no está en la dirección del propietario, o si el número de dirección de la propiedad no está en la dirección del propietario"

Escribí lo siguiente :

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

Al servidor SQL no le gustan los signos = después de las funciones CHARINDEX. ¿Cómo puedo reescribir esto para que sea aceptable para SQL Server? (Estoy usando SQL Server 2005 si es importante).

Respuesta

8

Las expresiones no pueden mostrarse verdaderas o falsas en SQL Server. (N tipo booleano) Pero se puede mover toda la expresión dentro de la when gusta:

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

No se puede poner expresión booleana en una lista de casos de búsqueda. A diferencia de los lenguajes de tipo C, en T-SQL un booleano no se puede comparar con otros valores. Y por último pero no menos importante, Transact-SQL no tiene TRUE y FALSE.

por lo que necesita para mover la expresión booleana en el caso WHEN, que expectes un valor lógico:

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

me ocurrió lo mismo que Shannon despido.

Ese código es una columna calculada correctamente.

probar la idea con este simple código:

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

Prueba esto:

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