定义一个具有多个值的变量

时间:2018-08-28 22:14:42

标签: oracle oracle-sqldeveloper

我想定义一种接受值列表的局部变量,以便可以在查询中引用该列表。我有一个字段“ my_field”,我想编写一个查询,当“ my_field”取值为“ term1”,“ term2”或“ term3”时返回1,并在取回其他值时返回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

这不起作用,但出现语法错误。我正在使用Oracle的SQLDeveloper。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我可以立即看到一些问题。

  • 定义变量时缺少等号;
  • 您的替代变量参考不应该用单引号引起来;
  • 您正在重复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