【问题标题】:mysql concat and substring_index in where clausewhere子句中的mysql concat和substring_index
【发布时间】:2021-07-20 16:42:24
【问题描述】:

我在表格中选择了一个值,格式如下:

day_shared =
    12_month
    3_month
    1_week

我需要将它用于 DATE_ADD() 中的函数,这是我目前拥有的代码,但它似乎出错了,我不确定我做错了什么。非常感谢一些帮助/建议

WHERE
    NOW() <  DATE_ADD(date_posted, INTERVAL CONCAT(CONVERT(SUBSTRING_INDEX(day_shared,'_', 1), SIGNED INTEGER),' ',UPPER(SUBSTRING_INDEX(day_shared,'_', -1))))

从 Gordon 尝试的解决方案:

NOW() < DATE_ADD(
  date_posted, 
  (
    CASE WHEN day_shared LIKE '%_week' THEN INTERVAL (
      SUBSTRING_INDEX(day_shared , '_', 1) + 0
    ) WEEK WHEN day_shared  LIKE '%_month' SUBSTRING_INDEX(day_shared , '_', 1) + 0 DAY THEN INTERVAL (
      SUBSTRING_INDEX(day_shared , '_', 1) + 0
    ) MONTH END
  )
) 


Something is wrong in your syntax '(
  CASE WHEN day_shared LIKE '%_week' THEN INTERVAL (
    SUBSTRING' on line 8

【问题讨论】:

  • 请为任何有帮助的答案投票,如果有任何答案为您解决了这个问题,请接受。

标签: mysql sql substring concatenation


【解决方案1】:
NOW()
<
CASE
  WHEN day_shared LIKE '%_week'
    THEN
      DATE_ADD(
        date_posted,
        INTERVAL (SUBSTRING_INDEX(day_shared , '_', 1) + 0) WEEK
      )
  WHEN day_shared LIKE '%_month'
    THEN
      DATE_ADD(
        date_posted,
        INTERVAL (SUBSTRING_INDEX(day_shared , '_', 1) + 0) MONTH
      )
END

【讨论】:

  • @tomaskeller - 最好将计算结果存储在列中。实际上,存储计算结果而不是正在使用的字符串。
【解决方案2】:

问题在于interval 1 day 中的day 是SQL 关键字,而不是字符串。所以你不能从列名中解析它。

因此,您可以改用CASE 表达式来处理不同的时间单位:

WHERE  NOW() <  (CASE WHEN day_shared LIKE '%_day'
                      THEN date_posted + INTERVAL (SUBSTRING_INDEX(day_shared, '_', 1) + 0) DAY
                      WHEN day_shared LIKE '%_week'
                      THEN date_posted + INTERVAL (SUBSTRING_INDEX(day_shared, '_', 1) + 0) WEEK
                      WHEN day_shared LIKE '%_month'
                      THEN date_posted + INTERVAL (SUBSTRING_INDEX(day_shared, '_', 1) + 0) MONTH
                  END)

这个语法works

【讨论】:

  • 我的错!情况是只能是月和周
  • @tomaskeller - 然后在 case 表达式中添加另一个级别,检查以 _week?? 结尾的字符串
  • 我有,但由于某种原因仍然出错
  • 编辑了问题,添加了我得到的错误
  • 我不相信如果不使用动态 sql(将 sql 语句动态创建为字符串,然后动态执行),这是可能的,因为 case 语句的结果将是一个 sql关键字,而不是 sql 数据类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2014-09-26
  • 2014-02-23
相关资源
最近更新 更多