Извлечение выражения SELECT с использованием функции или процедуры MySQL

Я заинтересован в упрощении SQL-запроса / представления путем извлечения выражения выбора (select_expr из документов MySQL). Каждый из 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_1, field_2, а также field_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 ответ

Решение

Вы чрезмерно усложняете код, здесь нет необходимости динамически генерировать 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;
Другие вопросы по тегам