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