Оценка логических выражений SQL Server - PullRequest
5 голосов
/ 16 сентября 2009

У меня есть таблица, в которой хранятся данные округа оценки округа. Я хочу добавить вычисляемый столбец, чтобы сказать, занято ли свойство владельцем. Я определяю «владелец занят» как «истина», если адрес свойства совпадает с адресом владельца, в противном случае - «ложь».

Из-за неточностей ввода данных в исходных данных округа, если я сделаю строгое сравнение текста, я получу много ложных результатов, не занятых владельцем. Поэтому я хочу проверить: «Если название улицы объекта недвижимости не указано в адресе владельца или если номер адреса объекта не указан в адресе владельца, то это свойство не занято владельцем» *

Я написал следующее:

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 ]

9 голосов
/ 16 сентября 2009

Выражения не могут возвращать true или false в SQL Server. (Нет логического типа) Но вы можете переместить все выражение внутри when, например:

alter table appriasaldata add 
    IsOwnerOccupied as 
     case when ((charindex(locastreetnumber, owneraddress) = 0) 
          or (charindex(locastreetname, owneraddress) = 0))
        THEN 1 ELSE 0
     end
2 голосов
/ 16 сентября 2009

Я придумал то же самое, что и Шеннон Северанс.

Этот код является правильным вычисляемым столбцом.

Проверьте идею с помощью этого простого кода:

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
2 голосов
/ 16 сентября 2009

Вы не можете поместить логическое выражение в список поиска регистра. В отличие от языков типа C, в T-SQL логическое значение нельзя сравнивать с другими значениями. И последнее, но не менее важное: Transact-SQL не имеет ИСТИНА и ЛОЖЬ.

Так что вам нужно переместить логическое выражение в регистр WHEN, который предполагает логическое выражение:

alter table appriasaldata add 
    IsOwnerOccupied as 
     case when
        (charindex(locastreetnumber, owneraddress) = 0) 
       or (charindex(locastreetname, owneraddress) = 0)
         THEN 1 ELSE 0
     end
0 голосов
/ 13 августа 2016

Попробуйте это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...