«CASE» в SQL Query не работает со строковыми значениями - PullRequest
1 голос
/ 28 марта 2019

У меня есть простой запрос «Case», который работает с числом, но не работает со строкой?

Это работает правильно:

SELECT
OrderItem_ID,Cost,
Case
    When Cost = 0 then 555
    Else Cost
End As CostStatus
FROM
    OrderItem

Не работает:

    SELECT
    OrderItem_ID,Cost,
    Case
        When Cost = 0 then "Free"
        Else Cost
    End As CostStatus
    FROM
        OrderItem

Ошибка: Неверное имя столбца «Свободно».

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Все результаты из выражения CASE должны возвращать один и тот же тип данных или должны быть неявно преобразованы в соответствии с приоритетом данных.В этом случае числовые типы имеют более высокий приоритет, чем строковые типы данных.Поэтому вам необходимо использовать явное преобразование.

SELECT
OrderItem_ID,Cost,
Case
    When Cost = 0 then 'Free'
    Else CAST( Cost AS varchar(13))
End As CostStatus
FROM
    OrderItem

РЕДАКТИРОВАТЬ: я изменил двойные кавычки на одинарные, которые являются стандартом в T-SQL.Двойные кавычки будут работать, только если QUOTED_IDENTIFIERS отключено.Обе проблемы присутствовали в представленном запросе.

0 голосов
/ 28 марта 2019

У вас две проблемы.

Строки SQL обычно заключаются в ', а не ". (MS Access является примером, где используется ", но стандарт SQL равен ', в том числе для SQL Server)

Это дает тебе это ...

SELECT
OrderItem_ID,Cost,
Case
    When Cost = 0 then 'Free'
    Else Cost
End As CostStatus
FROM
    OrderItem

Но затем вы пытаетесь поместить строку ('free') в тот же столбец, что и набор чисел: costStatus.

Вы хотите, чтобы этот столбец был строковым или числовым? Это не может быть одновременно ...

Может быть, у вас должно быть два столбца? У вас уже есть столбец cost сам по себе, так что может быть просто 'free' и 'not free' в качестве двух возможных значений состояния?

SELECT
OrderItem_ID,
Cost,
Case
    When Cost = 0 then 'Free'
    Else 'Not Free'
End As CostStatus
FROM
    OrderItem

Если вы просто можете заменить 0.00 в отчете словом free, вам не следует делать это в SQL. Вы должны сделать это в отчете (или любом другом уровне представления) .

...