2016-07-18 10 views
0

プロシージャ経由で読み込まれる2つの列で注文するには、mysqlには方法がありますか?2つのIN変数で注文する方法

例:

CREATE PROCEDURE sort_by_two 

(IN p_sort_1 VARCHAR(255) 

IN p_sort_2 VARCHAR(255)) 

BEGIN 

select * 

from table1 

ORDER BY p_sort_1, p_sort_2; 

END 

私はすでにこれをやってみましたが、私は私の列名を入力したときに、私は彼らが存在していない聞いています。

+0

以下の回答に役立つ作業はありますか? – Drew

答えて

0

はこれを試してみてください:

 
    CREATE PROCEDURE sort_by_two(IN p_sort_1 VARCHAR(255),IN p_sort_2 VARCHAR(255)) 

    BEGIN 
       SET @query = CONCAT('select empnumber,p_sort_1_fieldname,p_sort_2_fieldname from table_1 order by ' ,p_sort_1,',',p_sort_2); 
       PREPARE stmt FROM @query; 
       EXECUTE stmt; 


    END 


    To use this: 
    call sort_by_two('p_sort_1_fieldname','p_sort_2_fieldname'); 
    it should work.. 
0

これは、MySQL Prepared Statementを使用しています。それらは通常concat()と一緒に置かれます。また、ユーザー変数には常に@という記号が使用されます。 DECLAREのローカル変数ではありません。

スキーマ:ストアドプロシージャ

drop table if exists table1; 
create table table1 
( id int auto_increment primary key, 
    col2 int not null, 
    col3 int not null 
); 
insert table1 (col2,col3) values 
(1,1),(41,3),(21,2),(41,1),(31,18),(1141,2); 

drop procedure if exists sort_by_two; 
DELIMITER $$ 
CREATE PROCEDURE sort_by_two 
( IN p_sort_1 VARCHAR(255), 
    IN p_sort_2 VARCHAR(255) 
) 
BEGIN 
    set @theSql=concat("select * from table1 ORDER BY ",p_sort_1,",", p_sort_2); 
    PREPARE stmt1 from @theSql; 
    EXECUTE stmt1; 
    DEALLOCATE PREPARE stmt1; 
END$$ 
DELIMITER ; 

試験:

call sort_by_two('col2','id'); 
call sort_by_two('col3','col2'); 

はTESTIように見えますngは正常に動作します。

関連する問題