回答

收藏

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

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

我有一个包含一些数据的简单表:
& n# }' r; ~  \8 Q2 ], XDROP 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);现在,我有一个从列中检索数据顺序的过程。这可以按预期工作:
3 D, b* K( H1 Y5 b5 uDROP 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*/以及此:, `" F" i- z7 P) f' q7 U: p
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(); /* Should return 9、8、7、6、4、3、2*/现在,我的情况是:列名必须从过程中传递,所以我这样做:
) U* ^" u* C" |" C% D  p  YDROP 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*/但它不能正常工作。任何帮助都将受到欢迎。- B! h5 a+ t; Y8 i4 d$ t( O
编辑:
/ v; {, q$ H* z5 \* |7 D7 T给定@bill_karwin我试着用解决方案。CASE,再次测试我的变量:
/ f$ O* y! m" L( ?0 ~. C( eDROP 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。
/ N+ O3 p- C, w$ J" _# `                                                               
" w  S* W( O$ g    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则