使用MySQL函数或过程

时间:2017-05-23 17:43:38

标签: mysql sql mysql-routines mysql-function

我对通过从MySQL docs中提取选择表达式select_expr来简化SQL查询/视图感兴趣。每个select_expr基本上都是重复的,只有少量的变异可以提取到变量中。

例如,这是一个现有的查询/视图。

CREATE OR REPLACE VIEW my_view AS
SELECT

  json_unquote(json_extract(sr.response, concat(SUBSTRING_INDEX(json_unquote(
    JSON_SEARCH(mt.response, 'one', 'pref.field_1', NULL, '$.f[*].q')), '.', 2), 
    '.', 'value'))) AS field_1,

  json_unquote(json_extract(sr.response, concat(SUBSTRING_INDEX(json_unquote(
    JSON_SEARCH(mt.response, 'one', 'pref.field_2', NULL, '$.f[*].q')), '.', 2), 
    '.', 'value'))) AS field_2,

  json_unquote(json_extract(sr.response, concat(SUBSTRING_INDEX(json_unquote(
    JSON_SEARCH(mt.response, 'one', 'pref.field_3', NULL, '$.f[*].q')), '.', 2), 
    '.', 'value'))) AS field_3,

FROM my_table mt;

变量位为:field_1field_2field_3

从理论上讲,这就是我想做的事情:

CREATE OR REPLACE VIEW my_view AS
SELECT

  get_select_expr('field_1') AS field_1,
  get_select_expr('field_2') AS field_2,
  get_select_expr('field_3') AS field_3,

FROM my_table mt;

我一直在尝试以下内容,但不确定如何让select_expr进行评估。它返回一个字符串是有道理的,但我无法弄清楚如何让它进行评估。也许我应该使用一个程序,但这是我的MySQL知识崩溃的地方。

DROP FUNCTION IF EXISTS get_select_expr;
CREATE FUNCTION get_select_expr (field_name VARCHAR(255))
RETURNS VARCHAR(255) DETERMINISTIC
RETURN concat('json_unquote(json_extract(mt.response, concat(
    SUBSTRING_INDEX(json_unquote(JSON_SEARCH(mt.response, 
    \'one\', \'pref.', field_3, '', NULL, \'$.f[*].q\')), 
    \'.\', 2), \'.\', \'value\')))');

SELECT get_select_expr('field_1') AS field_1 FROM my_table;

我已经完成了所有建议的类似问题,但没有找到我需要的东西。知道我可能会出错或指点吗?我甚至不确定我是否正在寻找合适的条款。

1 个答案:

答案 0 :(得分:2)

你的代码过于复杂,没有必要在这里动态生成sql代码,无论如何它都无法正常工作。

只需创建一个函数,该函数将字段值和json字段值作为参数,您不需要动态sql:

DROP FUNCTION IF EXISTS get_select_expr;
CREATE FUNCTION get_select_expr (field_name VARCHAR(255), json_field_name varchar (255))
RETURNS VARCHAR(255) DETERMINISTIC
RETURN json_unquote(json_extract(field_name, concat(
    SUBSTRING_INDEX(json_unquote(JSON_SEARCH(field_name, 
    'one', 'pref.', json_field_name, '', NULL, '$.f[*].q')), 
    '.', 2), '.', 'value')));

SELECT get_select_expr(my_table.response, 'field_1') AS field_1 FROM my_table;