我想知道是否可以在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代码解决它,但不适用于外部工具或创建其他对象,如视图或表(对于某些语法优化不值得这么复杂)
答案 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