【问题标题】:Using a variable in WHERE statement column name在 WHERE 语句列名中使用变量
【发布时间】:2020-03-08 14:43:39
【问题描述】:

这不起作用。我的列名包括 Mon、Tue、Wed、Thu、Fri、Sat、Sun 设置为 0 或 1。我正在尝试根据一周中的 3 位数当前日期查看列名是 0 还是 1。

SET @var = DATE_FORMAT(NOW(), '%a') 
SELECT *, @var 
FROM team LEFT JOIN fav ON team.Tag = fav.Tag WHERE ID = '123456' AND @var = '1' 
ORDER BY team.Name

【问题讨论】:

  • 为什么需要SET?为什么不把它放在条件中呢?
  • 我最初尝试过 $var=date('D'); WHERE $var='1' 但这不起作用
  • 不能动态选择列名。这相当于星期一的SELECT *, '1'。考虑将您的数据设为properly relational,这样您就可以毫不费力地进行此查询。
  • 你能举个例子吗?
  • 您需要查找数据库范式并更好地了解如何关联您的数据以使此查询更简洁。应该是某一行与各种 on-day-X 表与其他行之间的一对多关系。

标签: mysql


【解决方案1】:

变量的@var 值是字符串文字,不能用作列。
你可以用CASE 表达式做你想做的事:

SET @var = DATE_FORMAT(NOW(), '%a'); 
SELECT *, @var 
FROM team LEFT JOIN fav 
ON team.Tag = fav.Tag 
WHERE ID = '123456' 
AND '1' = CASE @var
  WHEN 'Mon' THEN Mon
  WHEN 'Tue' THEN Tue
  WHEN 'Wed' THEN Wed
  WHEN 'Thu' THEN Thu
  WHEN 'Fri' THEN Fri
  WHEN 'Sat' THEN Sat
  WHEN 'Sun' THEN Sun
END
ORDER BY team.Name;

或者不带变量:

SELECT * 
FROM team LEFT JOIN fav 
ON team.Tag = fav.Tag 
WHERE ID = '123456' 
AND '1' = CASE DATE_FORMAT(NOW(), '%a')
  WHEN 'Mon' THEN Mon
  WHEN 'Tue' THEN Tue
  WHEN 'Wed' THEN Wed
  WHEN 'Thu' THEN Thu
  WHEN 'Fri' THEN Fri
  WHEN 'Sat' THEN Sat
  WHEN 'Sun' THEN Sun
END
ORDER BY team.Name;

CASE 表达式中,使用它们所属的表(teamfav)限定 Mon、Tue、Wed、Thu、Fri、Sat、Sun 列。

【讨论】:

  • SELECT ..., @var 部分在这里并没有真正的帮助,静态的'1' 也无济于事,但CASE 绝对是解决这个问题的方法。
  • 静态 '1' 是 WHERE 子句中的 OP 代码,为什么它没有帮助呢?选择列表中可能不需要@var,但由 OP 决定。
  • 我认为这是一些混乱的产物,而真正的意图是SELECT ..., CASE DATE_FORMAT(NOW(), '%a')...,或者更好的是DAYOFWEEK(NOW()),而不是DATE_FORMAT
  • OP 认为通过设置:SET @var = DATE_FORMAT(NOW(), '%a'); 然后可以在可以使用Mon 之类的列的地方使用变量。这就是使用变量的原因。当然可以通过在 CASE 语句中使用函数来编写没有它的代码。
  • 感谢@forpas 为我的问题提供解决方案。工作得很漂亮。我最终删除了变量并使用 SELECT * FROM team LEFT JOIN fav ON team.Tag = fav.Tag WHERE ID = '123456' AND '1' = CASE DATE_FORMAT(NOW(), '%a') WHEN 'Mon ' THEN Mon WHEN 'Tue' THEN Tue WHEN 'Wed' THEN Wed WHEN 'Thu' THEN Thu WHEN 'Fri' THEN Fri WHEN 'Sat' THEN Sat WHEN 'Sun' THEN Sun END ORDER BY team.Name;再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2012-02-19
  • 2014-02-16
  • 1970-01-01
  • 2023-03-02
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多