Postgres вложенный, если в случае запроса - PullRequest
7 голосов
/ 16 ноября 2010

Не могли бы вы сказать, почему в postgres sql не работает следующее:

See updated code below

ОБНОВЛЕНИЕ:

Я ожидаю, что запрос вернет значение "0.30" как float.Эта конструкция предназначена только для тестирования, у меня есть несколько сложных запросов, которые зависят от этой условной структуры ... Но я не знаю, как ее исправить ..

Результат:

ERROR:  syntax error at or near "1"
LINE 4:     if 1=1 then

ОБНОВЛЕНИЕ:

Эта конструкция появляется в функции ... поэтому я хочу сделать следующее:

CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$
  BEGIN
    select (
      case (select '1')
      when '1' then
        if 1=1 then
          0.30::float
        else
          0.50::float
        end
      else
         1.00::float
      end
    );
  END;
$$ LANGUAGE plpgsql;

select f_test(1) as test;

Сообщение об ошибке см. Выше.

Ответы [ 2 ]

9 голосов
/ 16 ноября 2010

Нет синтаксиса IF expr THEN result ELSE result END для обычных запросов SQL в Postgres.Поскольку нет функции IF(), как в MySQL, вы должны использовать CASE:

select (
  case (select '1')
  when '1' then
    case when 1=1 then 0.30::float else 0.50::float end
  else
     1.00::float
  end
);
1 голос
/ 16 ноября 2010

Я не знаю, чего вы пытаетесь достичь с помощью этой функции, но вот рабочая версия.

CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$
BEGIN
    IF myvalue = 1 THEN
            IF 1=1 THEN
                    RETURN 0.30::FLOAT;
            ELSE
                    RETURN 0.50::FLOAT;
            END IF;
    ELSE
            RETURN 1.0::FLOAT;
    END IF;
END;

Функция возвращает 0,3, если входное значение равно 1, в противном случае возвращается 1. Редактировать: Обратите внимание, что функция никогда не возвращает 0,5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...