我想定义一种接受值列表的局部变量,以便可以在查询中引用该列表。我有一个字段“ 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。任何帮助将不胜感激。
答案 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