回答

收藏

MySQL 5.7,使用存储过程中的变量按列名对表进行排序

技术问答 技术问答 214 人阅读 | 0 人回复 | 2023-09-12

我有一个包含一些数据的简单表:4 }8 s6 L6 V% ~
DROP TABLE IF EXISTS `MY_TABLE`;CREATE TABLE IF NOT EXISTS `MY_TABLE` (  `id` CHAR(40) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL, PRIMARY KEY (`id`));INSERT INTO `MY_TABLE` (`id`) VALUES (1);INSERT INTO `MY_TABLE` (`id`) VALUES (2);INSERT INTO `MY_TABLE` (`id`) VALUES (3);现在,我有一个从列中检索数据顺序的过程。这可以按预期工作:! L/ R4 {+ B% k% @
DROP PROCEDURE IF EXISTS test_procedure;DELIMITER $$CREATE PROCEDURE test_procedure()BEGIN  SELECT id AS columnAlias FROM `MY_TABLE`  ORDER BY columnAlias;END $$DELIMITER ;CALL test_procedure();  /* Returns 1、2、3、4、5、6、7、8*/以及此:
* @: ?1 L: E- i! E- G+ gDROP PROCEDURE IF EXISTS test_procedure;DELIMITER $$CREATE PROCEDURE test_procedure()BEGIN  SELECT id AS columnAlias FROM `MY_TABLE`  ORDER BY -columnAlias;END $$DELIMITER ;CALL test_procedure(); /* Should return 9、8、7、6、4、3、2*/现在,我的情况是:列名必须从过程中传递,所以我这样做:
3 n1 C8 L1 h9 V% E- bDROP PROCEDURE IF EXISTS test_procedure;DELIMITER $$CREATE PROCEDURE test_procedure(IN data JSON)BEGIN  SET @sortBy  = JSON_UNQUOTE(JSON_EXTRACT(DATA,'$.sortBy);SELECT id AS columnAlias FROM `MY_TABLE`  ORDER BY @sortBy;END $$DELIMITER ;CALL test_procedure('{"sortBy": "columnAlias"}); ;* Should return 1、2、3、4、5、6、7、8*/CALL test_procedure('{"sortBy": "-columnAlias"}'); /* Should return 9、8、7、6、4、3、2*/但它不能正常工作。任何帮助都将受到欢迎。
5 |& ~$ K: b2 M8 {编辑:1 P/ ^5 ^" A3 a0 v" h9 K, \# S
给定@bill_karwin我试着用解决方案。CASE,再次测试我的变量:
& \/ |4 v  s& m- c% s" JDROP PROCEDURE IF EXISTS test_procedure;DELIMITER $$CREATE PROCEDURE test_procedure(IN data JSON)BEGIN  SET @sortBy  = JSON_UNQUOTE(JSON_EXTRACT(DATA,'$.sortBy);SELECT id AS columnAlias FROM `MY_TABLE`  ORDER BY     CASE @sortBy       WHEN "columnAlias" THEN columnAlias      WHEN "-columnAlias" THEN -columnAlias    END ;END $$DELIMITER ;CALL test_procedure('{"sortBy": "-columnAlias"}');虽然我不能正常工作,但我会回到1、2、3,但当我传递带减号的字符串时,我应该反转:-columnAlias。2 b3 F9 i* H5 ?4 d3 z6 o, x& F" g
                                                               
4 d" @5 a  P0 j1 h    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则