2017-05-23 15 views
0

선택 식 (MySQL docs에서 select_expr)을 추출하여 SQL 쿼리/뷰를 단순화하는 데 관심이 있습니다. select_expr은 기본적으로 변수로 추출 될 수있는 작은 양의 변형으로 복제됩니다.MySQL 함수 또는 프로 시저를 사용하여 SELECT 식 추출

예를 들어 다음은 기존 쿼리/뷰입니다.

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_2field_3. 나는 다음과 같은 시도하지만, select_expr 평가에 도착하는 방법을 잘 봤는데

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; 

:

은 이론적으로,이 내가하고 싶은 것입니다. 그것은 문자열을 반환하는 것이 합리적이지만, 평가할 수있는 방법을 알 수는 없습니다. 어쩌면 내가 프로 시저를 사용해야하지만, 이것이 내 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; 

내가 제안한 유사한 질문을 모두 수행했지만 필요한 것을 찾지 못했습니다. 내가 잘못 가고있는 어떤 생각이나 포인터? 나는 올바른 용어를 찾고 있는지조차 확신하지 못합니다.

+0

, 당신은 전체 SQL 문에서이 필요합니다 :

그냥 필드 값과 매개 변수로 JSON 필드 값을받는 함수를 만들고 동적 SQL이 필요하지 않습니다 한 조각. 문자열 변수의 내용은 데이터로 남아 있습니다. 준비된 명령문을 사용하여 SQL 문을 동적으로 어셈블하고 실행할 수 있지만 여전히 from 절을 사용하여 전체 명령문이 필요합니다. – Shadow

+0

당신이 할 수있는 일은 수식을 함수에 캡슐화하고 필드 이름을 매개 변수로 전달하여 출력을 계산하는 것입니다. – Shadow

답변

1

코드가 복잡해 졌으므로 여기에 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; 
+0

제 질문에서'concat'을 제거하면 예상대로 작동합니다. 별칭을 사용하여 질문을했지만 필드 이름을 복제 할 필요가 없기를 바랬습니다. 귀하의 대답을보기 전에 각 SQL 부분을 생성 한 함수를 작성한 다음 모든 함수를 작성하여 전체 SQL 쿼리로 작성했습니다. 그런 다음 프로 시저를 사용하여 실행했습니다. 따라 가기가 너무 어려웠습니다. 동료들과 토론 한 후에, 우리는 약간의 중복을 가지고이 방법을 사용할 것입니다. 감사 – wsams