简体   繁体   English

为什么VARCHAR变量无法在内部查询中用作mysql存储过程中的列名?

[英]Why the VARCHAR variable not working to use inside queries as column names in mysql stored procedures?

Is there a solution for using variable filter in the select statement for a column name without concatenating it with the query ?. 是否有解决方案,可以在select语句中为列名使用变量过滤器而不将其与查询连接?
Not working 不工作

BEGIN 
    Declare StartRow int;
    set StartRow = ((PageNumber - 1) * PageSize);



  SELECT 
t.qid,
t.title,
t.vote,
t.answer_count,
t.creation_date,
t.uid,
t.username,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.tag END) AS tag1,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.tid END) AS tid1,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.tag END) AS tag2,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.tid END) AS tid2,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.tag END) AS tag3,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.tid END) AS tid3,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.tag END) AS tag4,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.tid END) AS tid4,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.tag END) AS tag5,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.tid END) AS tid5
FROM
(
    SELECT
        questions.id as qid,
        title,
        creation_date,
        vote,
        answer_count,
        tags.id as tid,
        tag,            
        username,
        users.id as uid,            
        IF (@prev = qid ,@c := @c + 1,@c := 1) constantTagNumber,
        @prev := qid
    FROM    (   SELECT @prev := 0 ,@c := 1) var,question_tags
    INNER JOIN tags ON question_tags.tid = tags.id
    RIGHT JOIN questions ON question_tags.qid = questions.id 
    INNER JOIN users ON users.id=owner_id
    ORDER BY    qid,tid
) t
GROUP BY t.qid ORDER BY filter desc LIMIT StartRow,PageSize;         
END

The problem is only with the last order by filter here filter is a varchar variable that I am using as a parameter. 问题仅order by filter的最后order by filter这里filter是我正在用作参数的varchar变量。


Since filter is a variable ,the above code is not working. 由于filter是一个变量,因此以上代码无法正常工作。
Can anyone suggest an simple solution to make it work. 任何人都可以提出一个简单的解决方案来使其运行的。

Make It work means ,I need to use the column name to use as order by from parameter. 使它工作意味着,我需要使用列名作为通过from参数的命令。

Update 更新资料

   BEGIN 
    Declare StartRow int;
    set StartRow = ((PageNumber - 1) * PageSize);

set @sql1=(
  SELECT 
t.qid,
t.title,
t.vote,
t.answer_count,
t.creation_date,
t.uid,
t.username,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.tag END) AS tag1,
MAX(CASE WHEN t.constantTagNumber = 1 THEN t.tid END) AS tid1,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.tag END) AS tag2,
MAX(CASE WHEN t.constantTagNumber = 2 THEN t.tid END) AS tid2,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.tag END) AS tag3,
MAX(CASE WHEN t.constantTagNumber = 3 THEN t.tid END) AS tid3,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.tag END) AS tag4,
MAX(CASE WHEN t.constantTagNumber = 4 THEN t.tid END) AS tid4,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.tag END) AS tag5,
MAX(CASE WHEN t.constantTagNumber = 5 THEN t.tid END) AS tid5
FROM
(
    SELECT
        questions.id as qid,
        title,
        creation_date,
        vote,
        answer_count,
        tags.id as tid,
        tag,            
        username,
        users.id as uid,            
        IF (@prev = qid ,@c := @c + 1,@c := 1) constantTagNumber,
        @prev := qid
    FROM    (   SELECT @prev := 0 ,@c := 1) var,question_tags
    INNER JOIN tags ON question_tags.tid = tags.id
    RIGHT JOIN questions ON question_tags.qid = questions.id 
    INNER JOIN users ON users.id=owner_id
    ORDER BY    qid,tid
) t
GROUP BY t.qid); 
set @sql=CONCAT(@sql1," ORDER BY ",filter," desc LIMIT", StartRow,",",PageSize);

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END

I Updated the above code ,what am I missing here . 我更新了上面的代码,我在这里错过了什么。

You are getting close: Change your code to create a VARCHAR with your SQL in it, use IF/ELSE logic to concatenate your order by in there. 您将近:更改代码以在其中创建带有SQL的VARCHAR,然后使用IF / ELSE逻辑在此处串联您的订单。 Then pass this SQL to the prepared statement: 然后将此SQL传递给准备好的语句:

SET @sql = "Your SQL";
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM