回答

收藏

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

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

我有一个包含一些数据的简单表:5 ^1 e5 t' T4 e
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);现在,我有一个从列中检索数据顺序的过程。这可以按预期工作:
- M' q% J/ q# }$ ]9 g# VDROP 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*/以及此:
) j1 Q# @8 M' @7 Q# eDROP 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*/现在,我的情况是:列名必须从过程中传递,所以我这样做:+ X7 ?) z4 g- x; Y
DROP 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*/但它不能正常工作。任何帮助都将受到欢迎。
) a! t/ Z7 b4 T& R0 S9 W编辑:2 l4 D* {6 r4 J, i' e: _7 q( W
给定@bill_karwin我试着用解决方案。CASE,再次测试我的变量:
( S( a9 n: a2 H4 t  h& 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。; W# q4 f2 c1 e2 m3 E) z
                                                               
* W4 t. L9 b; Z6 x    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则