我们如何将变量用作列名?
在我的表日(MONDAY,TUESDAY ..)是列名。
我想动态获取DAY并在查询中使用AS COLUMN NAME。
我的查询:
SELECT EMP FROM SCHEDULE WHERE "DAY"(Dynamically I want) =1;
答案 0 :(得分:1)
您根本无法使用变量来更改查询的实际文本。变量可以仅用于代替文字值(日期,字符串,时间,数字),但它们不能更改实际命令的文本。
技术原因是(过度简化事情)oracle FIRST解析文本,建立执行计划,并且只有在考虑变量的值之后。您可以或多或少地思考(这只是一个类比,当然,它实际上并不是一回事!)oracle“编译”查询,就像C ++编译器编译函数的源代码一样:不可能将c ++过程传递给修改过程本身文本的变量。
你需要做的是重新思考你的方法,考虑我刚才所说的:
SELECT EMP FROM SCHEDULE
WHERE
(case :DAY_I_WANT
WHEN 'MONDAY' then -- 'MONDAY' is the string value of the variable :DAY_I_WANT
monday -- monday, here is the column whose value I want CASE to return
WHEN 'TUESDAY' then tuesday
...
...
WHEN 'SUNDAY' then sunday
end) = 1
请记住,此解决方案不会利用MONDAY..SUNDAY列上的任何索引。最好的方法是创建一个不同的数据结构,每天有一个单独的行和一个正确的dayofweek列。如果你这样做,你将能够写:
select EMP from schedule
where schedule.DAY = :DAY_I_WANT
它将允许您在DAY列上创建索引,从而加快搜索速度。
每天都有一个单独的列等于寻找麻烦。