从带有IF的表中选择

时间:2012-11-12 14:38:26

标签: mysql

我正在处理一些报告,我正在尝试创建一个查询,根据所选日期选择不同的查询,这是我想要实现的简化版本

SELECT *
FROM
    IF(YEAR('###date start###'=2011),table_2011,table)
WHERE
    date_start BETWEEN '###date start###' AND '###date end###'

###date start######date end###是用户输入的参数。

我无法使用该语言根据日期选择不同的表,因为这只是一个示例,我可能会传递其他参数来选择不同的表。

我在想我需要创建一个新的preg_replace并强制创建查询的人添加类似###if(test,val2,val2)###的内容但是如果mysql已经可以做到这一点我不想重新发明热 - 水

谢谢

修改

在等待更好的解决方案时,我将“搜索替换”功能改为简单: ###search### => value(### search ###向最终用户显示为手动输入的字段),也接受格式化的新字段 LLLlabel[option:value,option:value,option:value,....]LLL

不是最好的解决方案,因为我希望我只能使用MySQL,因为这个解决方案只会让最终用户不得不选择额外的参数。

请记住,问题只是查询的非常简化版本,查询可以是子查询,联合或联接的一部分,而不仅仅是time分离

2 个答案:

答案 0 :(得分:1)

具有以下内容的存储过程将起作用:

DELIMITER //

CREATE PROCEDURE example(date_start DATETIME, date_end DATETIME)
BEGIN
    SET @table = IF(YEAR(date_start)=2011,'table_2011','table');

    SET @sql = CONCAT(
        "SELECT * FROM ",
        @table,
        " WHERE date_start BETWEEN ",
        QUOTE(date_start),
        " AND ",
        QUOTE(date_end)
    ); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END;
//

DELIMITER ;

并通过以下方式调用:

CALL example('###date start###', '###date end###');

或者如果您的数据在MyISAM表中,您可以设置MERGE表:

CREATE TABLE all_tables (...) ENGINE = MERGE UNION=(table_2011, table);

SELECT *
FROM
    all_tables
WHERE
    date_start BETWEEN '###date start###' AND '###date end###'

答案 1 :(得分:0)

如果表格不相交,这可能会起作用:

select *
from (select * from table_2011
      union
      select * from table) x
where date_start BETWEEN '###date start###' AND '###date end###';

<强>更新

如果您关注大小,则应考虑对表进行分区。见