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 解决方案: |
|
|
|
|
|