在SQL语句中声明变量

时间:2015-08-10 17:09:55

标签: mysql sql

我想知道是否可以在sql select查询中创建变量 以下示例中的说明,我们从过去一个月(或更早)发布/或更新的城市中选择新闻:

set @monthBack = 1; -- one month back in time
set @cityName = "Berlin"; -- take a city name

select n.title, coalesce (n.releaseDate, n.updateDate) as news_date 
from news as n
inner join with cities as c on c.id = n.cityid
where 
    c.name = @cityName and
    year(coalesce (n.releaseDate, n.updateDate)) = 
                                 year(current_date - interval @monthBack month)
    month(coalesce (n.releaseDate, n.updateDate)) = 
                                 month(current_date - interval @monthBack month)
order by coalesce (n.releaseDate, n.updateDate)

如果未定义发布日期,则新闻日期将是更新日期。

所以,我想用特定于具体选择语句的特定变量替换coalesce (n.releaseDate, n.updateDate)的重复...

是否可以在mysql数据库中使用?

PS。

作为"问题"更多关于sql语法和代码可读性,我想通过修改sql代码解决它,但不适用于外部工具或创建其他对象,如视图或表(对于某些语法优化不值得这么复杂)

1 个答案:

答案 0 :(得分:0)

我可以想出很多方法来解决你的问题,但我不确定哪一方是最好的。

你可以做一个&#34 ;;用"子查询确定" coalesce(n.releaseDate,n.updateDate)"的值然后在下面的查询中使用它。

或者使用存储过程ou函数来重现正确的参数

您可以对表新闻进行查看,并添加一个值为" coalesce(n.releaseDate,n.updateDate)"

的列

或者你也可以这样做:

set @monthBack = 1; -- one month back in time
DECLARE @Query NVarchar(Max),
        @NewsDate NVARCHAR(MAX)

SET @NewsDate = coalesce (n.releaseDate, n.updateDate) -- Determine the value here

SET @Query = 
'select n.title, '+@NewsDate+' as news_date 
 from news as n
 inner join with cities as c on c.id = n.cityid
 where 
     c.name='Berlin' and
     year('+@NewsDate+') = 
                                  year(current_date - interval @monthBack month)
     month('+@NewsDate+')) = 
                                  month(current_date - interval @monthBack month)
 order by '+@NewsDate

execute sp_executesql @Query