我正在尝试将参数传递给我创建的视图。 这是我的代码。
CREATE FUNCTION param1() RETURNS VARCHAR(50) DETERMINISTIC NO SQL RETURN @param1;
CREATE VIEW `view_stats` AS SELECT * FROM `history` WHERE fullname = param1() ;
这是我的查询
SELECT st.*, mtr.max_open_trades, mtr.max_draw_down FROM `view_stats` AS ST INNER JOIN `mtrecords` AS mtr ON st.login = mtr.login WHERE st.login=?
如何将参数传递给此查询的view_stats
?
答案 0 :(得分:0)
SQL视图可以被视为在其他查询中包含固定子查询的简写,因此它无法执行普通查询无法执行的任何操作。如果参数需要在结构上改变正在运行的查询,那么您需要将整个查询放在某种函数中。
看起来你在这里所做的只是设置WHERE子句,所以你可以在视图中包含你要过滤的列,并在查询时使用WHERE子句。
答案 1 :(得分:0)
是的,您可以通过创建一个函数来从会话变量获取值来以简单的方式将参数传递给您的视图。有关该技术,请参阅https://www.stackoverflow.com/questions/14511760。这是我可能希望在之后模式化的创建功能的副本。 DELIMITER //
创建功能fn_getcase_id()
返回MEDIUMINT(11)
决定没有SQL
BEGIN
RETURN @sv_case_id;
END //
DELIMITER; 您需要创建一个类似的FN(每个变量一个)。
答案 2 :(得分:0)
这是一个简单的解决方案,可通过多个表之间的多个联接查询来改善VIEWS慢的问题。
DELIMITER ;;
CREATE PROCEDURE `SP_QUERY_VIEW_WITH_PARAMETERS`(IN p_having VARCHAR(300))
COMMENT 'Executes the statement'
BEGIN
SET @v_having = p_having;
SET @v_sql=CONCAT('SELECT
id AS id_emp ,
user AS emp_name,
.
.
.
FROM table1
UNION ALL
SELECT
idtifier_us AS id_emp ,
description AS emp_name,
.
.
.
FROM table2');
SET @v_sql2 = CONCAT(@v_sql,@v_having);
PREPARE stmt FROM @v_sql2;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END ;;
DELIMITER ;
CALL `SP_QUERY_VIEW_WITH_PARAMETERS`('having id_emp=63 and emp_name like ''VANDERLEI%'' and created_at between ''2019-05-01'' and ''2019-05-17'' ')