Оператор if-then в запросе SQL настаивает на попытке преобразования в неправильный тип, а затем завершается ошибкой - PullRequest
1 голос
/ 04 ноября 2019

У меня есть SQL-запрос, связывающий таблицу 1 с таблицей 2 через внутреннее соединение, содержащий эту часть в части выбора select:

select
table1.field1,
table2.field1,
CASE (table2.field1)
     WHEN -2 THEN ''
     ELSE table2.field2
END as table2Field2,
table3.field4
from...

Я хочу иметь возможность вернуть table2Field2, когда онаимеет соответствующее значение, т. е. когда объект, представленный в таблице 2, не равен нулю, так что table2.field1 не имеет значения -2. В этом случае значение table2Field2 должно быть пустым, а не бессмысленным значением.

Однако вместо пустого текста возвращается 0. Если я изменю эту строку:

 WHEN -2 THEN ''

на эту:

 WHEN -2 THEN 'someText'

, то мне будет жаловаться, что она пытается преобразовать int в строку, а я нет. table2field1 - это целое число, но table2Field2 - это строка, которую мы на самом деле возвращаем здесь.

Как я могу указать (даже более конкретно) в этом запросе, что я возвращаю строковое поле в виде строки, а не что-то еще как строка, которая не является (а) строкой и (б) тем, что я указал, я возвращаю, пожалуйста?

Все предложения приветствуются, большое спасибо заранее за любую помощь:)

Ответы [ 3 ]

1 голос
/ 04 ноября 2019

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

SQL Server: DEMO

select
t.col1,
CASE
     WHEN convert(char,t.col1) = '-2' THEN 'aaa'
     ELSE convert(char,(t.col2))
END test
from Tab1 t;

Oracle DEMO

select
t.col1,
CASE
     WHEN to_char(t.col1) = '-2' THEN 'aaa'
     ELSE to_char(t.col2)
END test
from tab1 t;
1 голос
/ 04 ноября 2019

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

Если вы хотите пустую строку для вашего первого вывода, вы можете CAST или CONVERT ваш второй вывод до значения типа символа:

select
table1.field1,
table2.field1,
CASE (table2.field1)
     WHEN -2 THEN ''
     ELSE CAST(table2.field2 AS varchar(12)) --< 12 will cover any value of integer.
END as table2Field2,
table3.field4
from...
1 голос
/ 04 ноября 2019

Возможно, у вас есть as table2field2 в неправильном месте?

, возможно, попробуйте:

select
table1.field1,
table2.field1,
CASE (table2.field1)
     WHEN -2 THEN ''
     ELSE table2.field2
END as table2Field2,
table3.field4
from...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...