MySQL查询中的用户定义变量

时间:2012-05-24 19:52:58

标签: mysql variables procedure

我正在尝试在SQL中创建数据抽象,在那里我可以选择我想要查看员工信息的季度。现在我使用命名系统Q1_P1_N作为“Quarter 1 Project 1 name”,Q1_P1_W是“...... project 1 weight”。员工可以处理多个项目。 到目前为止我所拥有的是:

CREATE PROCEDURE effort_lookup4(IN proj_name VARCHAR(20), IN quarter INT(1))
BEGIN
SET @Qx_P1_N = CONCAT('Q', quarter, '_P1_N');
SET @Qx_P2_N = CONCAT('Q', quarter, '_P2_N');
SET @Qx_P1_W = CONCAT('Q', quarter, '_P1_W');
SET @Qx_P2_W = CONCAT('Q', quarter, '_P2_W');
SET @var1 = (SELECT sum(@Qx_P1_W) FROM table_test WHERE @Qx_P1_N = proj_name);
SET @var2 = (SELECT sum(@Qx_P2_W) FROM table_test WHERE @Qx_P2_N = proj_name);

我的问题是每当我使用@ Qx_P1_N或@ Qx_P1_W调用查询时,我实际上并没有传递正确的查询,我无法弄清楚我做错了什么。这应该很容易我只是刚开始使用SQL。

以下是表格的示例,除了它继续进入Q2_P1_N,依此类推:

+------+---------+---------+---------+---------+
| EMPID| Q1_P1_N | Q1_P2_N | Q1_P1_W | Q1_P2_W |
+------+---------+---------+---------+---------+
| 1000 | ProjA   | ProjB   |    0.50 |    0.50 |
| 1001 | ProjA   | NULL    |    1.00 |    NULL |
| 1010 | ProjB   | NULL    |    1.00 |    NULL |
| 1011 | ProjA   | ProjB   |    0.50 |    0.50 |
+------+---------+---------+---------+---------+

由于

2 个答案:

答案 0 :(得分:0)

在select语句中,字段中的变量应该是表中的列名。您需要为Q1_P1_W切换@ Qx_P1_W。

答案 1 :(得分:0)

要使用现有数据结构执行所需操作,您需要使用prepared statements(将所需的SELECT语句构建为字符串,然后PREPAREEXECUTE )。

但是,您可能会发现更改数据结构更容易:

+------+---------+---------+--------+
| EMPID| quarter | project | weight |
+------+---------+---------+--------+
| 1000 |       1 | A       |   0.50 |
| 1000 |       1 | B       |   0.50 |
| 1001 |       1 | A       |   1.00 |
| 1010 |       1 | B       |   1.00 |
| 1011 |       1 | A       |   0.50 |
| 1011 |       1 | B       |   0.50 |
+------+---------+---------+--------+