Определение переменной, принимающей несколько значений - PullRequest
0 голосов
/ 29 августа 2018

Я хочу определить какую-то локальную переменную, которая принимает список значений, чтобы я мог ссылаться на этот список в запросе. У меня есть поле «my_field», и я хочу написать запрос, который возвращает 1, когда «my_field» принимает значение «term1», «term2» или «term3», и возвращает 0, когда он принимает любой другой значение.

Вот что я пытался:

DEFINE my_variable IN ('term1', 'term2', 'term3');

SELECT
   CASE WHEN my_field IN '&my_variable' THEN 1 ELSE 0 END AS 'new_field'
FROM my_table

Хотя это не работает, я получаю синтаксические ошибки. Я использую SQLDeveloper от Oracle. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 29 августа 2018

Я вижу несколько вопросов вне игры.

  • при определении переменной вы пропускаете знак равенства;
  • ссылка на переменную подстановки не должна быть в одинарных кавычках;
  • вы повторяете ключевое слово IN;
  • псевдоним выражения столбца также не должен быть в одинарных кавычках.

DEFINE my_variable = IN ('term1', 'term2', 'term3')

SELECT
   CASE WHEN my_field &my_variable THEN 1 ELSE 0 END AS new_field
FROM my_table

Выполнение этого с set verify on показывает последний, действительный запрос, который он генерирует:

old:SELECT
   CASE WHEN my_field &my_variable THEN 1 ELSE 0 END AS new_field
FROM my_table
new:SELECT
   CASE WHEN my_field IN ('term1', 'term2', 'term3') THEN 1 ELSE 0 END AS new_field
FROM my_table

 NEW_FIELD
----------
         1

У меня есть много терминов, которые я вставляю в переменную, и я добавляю разрывы строк, чтобы сохранить код в чистоте. Однако, когда я делаю это, это приводит к ошибке запроса.

Если вы хотите разбить define на несколько строк, вы можете использовать символ продолжения -, но в SQL Developer вам нужно сделать его комментарием, чтобы он работал правильно:

DEFINE my_variable = IN ( --
  'term1', --
  'term2', --
  'term3')

SELECT
   CASE WHEN my_field &my_variable THEN 1 ELSE 0 END AS new_field
FROM my_table
/

который set verify on показывает как:

old:SELECT
   CASE WHEN my_field &my_variable THEN 1 ELSE 0 END AS new_field
FROM my_table

new:SELECT
   CASE WHEN my_field IN ( --
  'term1', --
  'term2', --
  'term3') THEN 1 ELSE 0 END AS new_field
FROM my_table

 NEW_FIELD
----------
         1
...