如何使用变量选择选择的列?

时间:2015-09-04 16:48:37

标签: oracle plsql

我们如何将变量用作列名?

在我的表日(MONDAY,TUESDAY ..)是列名。

我想动态获取DAY并在查询中使用AS COLUMN NAME。

我的查询:

SELECT EMP FROM SCHEDULE WHERE "DAY"(Dynamically I want) =1;

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列上创建索引,从而加快搜索速度。

每天都有一个单独的列等于寻找麻烦。