6

今日、mysql select ステートメントで動的な列名が必要なため、Mysql で立ち往生しています。説明させてください:

sql> select name1 from namescollection. 
sql> select name2 from namescollection. 
sql> select name3 from namescollection. 

したがって、namescollection テーブルには name1、name2、name3 を持つ 3 つの列があり、ストアド プロシージャでこのテーブルを動的として 1,2,3 としてクエリし、変数として渡されますが、クエリを実行すると単純な SQL でもクエリが実行されます。

SELECT concat('name','1') FROM `namescollection` 

name1 ----- name1 rather fetching name1 field's value.

concat を呼び出しているときに name1 を出力する権利はわかっていますが、concat を使用する必要がある正しい関数ですが、それを列名として使用したいと考えています。

4

2 に答える 2

13

できることは、ストアドプロシージャ内でプリペアドステートメントを使用することです。これにより、文字列クエリを実行できるようになります。

簡単な例として:

DELIMITER //
CREATE PROCEDURE selname (IN col VARCHAR(20))
BEGIN
  SET @sql = CONCAT('SELECT ', col, ' FROM tbl');
  PREPARE stmt FROM @sql;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END//
DELIMITER ;

このSQLFiddleデモでテストしてください

于 2012-07-28T07:32:14.320 に答える
5

ストア プロシージャ内の動的列名 Update ステートメント:

DELIMITER //
CREATE DEFINER=`root`@`localhost` PROCEDURE `selname`()
BEGIN
    declare cl int ;
    declare clvalue int ;

    set cl=1;
    SET clvalue=1;
    while cl < 4 DO
        SET clvalue=clvalue*cl;
        SET @sql = CONCAT('update test set col',cl, '=',clvalue,' where id=1');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        set cl=cl+1;
   end while;

END //
DELIMITER ;
于 2015-03-19T10:04:30.527 に答える