Извлечение выражения 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;