2014-11-04 2 views
0

Я пытаюсь написать SQL-запрос, который использует CASE и STRING вместе и получает ошибку. Это то, над чем я пытаюсь работать. Любая помощь приветствуется. Я также попытался добавить функцию STRING, но также не работает.SQL с использованием CASE с функцией STRING

SELECT Case 
     when sn.1_code = 1 then 'Attended -- ' , 
            sn.mult_1 , 
            , 'and' , 
            sn.dict_2 , 
            ' also acted with ' , 
            sn.dict_3 , 
            '.' , 
     when sn.1_code = 3 then 'left because ' , 
            sn.mult_2 , 
            '.' , 
     when sn.dict_1 = 2 then 'Went home' , 
     when sn.dict_1 = 24 then 'Canceled' AS 'Attendance' 
FROM db.sn 
+0

Какие СУБД вы используете? – JNevill

+0

Тип RDBMS - система кэширования систем Inter. Но используйте SQL для написания запроса. – Dagz200

ответ

1

Как указывалось в других ответах, вам необходимо объединить ваши строковые значения. С самого самого маленького, что я знаю о Intersystems Cache SQL (я просто посмотрел его), вы соедините need to use ||, чтобы объединить значения (вы также можете использовать функцию CONCAT(), но она позволяет только два параметра):

SELECT Case 
    when sn.1_code = 1 then 'Attended -- ' || 
           sn.mult_1 || 
           'and' || 
           sn.dict_2 || 
           ' also acted with ' || 
           sn.dict_3 || 
           '.' 
    when sn.1_code = 3 then 'left because ' || 
           sn.mult_2 || 
           '.' 
    when sn.dict_1 = 2 then 'Went home' 
    when sn.dict_1 = 24 then 'Canceled' END AS 'Attendance' 
FROM db.sn 

Вы также были некоторые дополнительные запятые там, а также отсутствующий END в конце вашего CASE statement

+0

I попробовал, а также получил сообщение об ошибке SQL), нашел – Dagz200

+0

. Интересно, это что-то вроде версии, или есть что-то еще, что мне не хватает. Не знакомы с кэшем Intersystems, это трудно сказать. Проверьте ответ Гордона, используя функция 'String()', возможно, это сделает трюк. – JNevill

+0

Это сработало с помощью «||», который сделал это за вашу помощь. – Dagz200

4

Похоже, вы пытаетесь объединить строки. Фактический оператор может варьироваться в зависимости от вашего серверного программного обеспечения, но идея будет:

SELECT 
Case 
    when sn.1_code = 1 
    then 'Attended -- ' + sn.mult_1 + 'and' + sn.dict_2 + ' also acted with ' + sn.dict_3 + '.' 
    when sn.1_code = 3 
    then 'left because ' + sn.mult_2 + '.' , 
    when sn.dict_1 = 2 
    then 'Went home' , 
    when sn.dict_1 = 24 
    then 'Canceled' 
End AS 'Attendance' 
FROM db.sn 
0

Если вы пытаетесь конкатенации, как мне кажется, вы делаете это с символом +, а не запятая :

SELECT 
Case when sn.1_code = 1 then 'Attended -- ' + 
sn.mult_1 + 
'and' + 
sn.dict_2 + 
' also acted with ' + 
sn.dict_3 + 
'.' 
when sn.1_code = 3 
then 'left because ' + sn.mult_2 + '.' 
when sn.dict_1 = 2 then 'Went home' 
when sn.dict_1 = 24 then 'Canceled' 
END AS 'Attendance' 
FROM db.sn 

не видя ваш пример с функцией Струнный, я не знаю, что вы пытаетесь сделать с ним.

+0

Пробовал и не пробовал ошибку, говоря «Ошибка в ROW SQL Statement: Идентификатор ожидаемый,? Найден – Dagz200

+0

Хорошо, мой ответ предполагал SQL Server, но я не знаю, какие RDBMS вы используете. Попробуйте ответить JNevill. –

2

Intersystems Cache, как представляется, поддерживает два аргумента concat() функции (ала Oracle). Он также поддерживает string(). Это должно делать то, что вы хотите:

SELECT (Case when sn.1_code = 1 
      then string('Attended -- ', sn.mult_1, 'and', sn.dict_2 , ' also acted with ', sn.dict_3 , '.') 
      when sn.1_code = 3 
      then string('left because ', sn.mult_2 , '.') 
      when sn.dict_1 = 2 
      then 'Went home' 
      when sn.dict_1 = 24 
      then 'Canceled' 
     end) AS 'Attendance' 
FROM db.sn; 

case заявление также нуждается в end.

+0

Я попробовал и получил ошибку SQL-запрос IDENTIFIER, ожидаемый,? – Dagz200

Смежные вопросы