如何告诉 mysql 在不处理的情况下跳过为空或 null 的列

How to tell mysql to skip a column if it is empty or null with out processing

我有一个名为 stocks 的 table 有一些 5 列包含 data.Out 5 一些列可能 empty.Below 是我的 table 结构。

+------------+------------+------------+--------+--------+
| level1     | level2     | level3     | level4 | level5 |
+------------+------------+------------+--------+--------+
| 2015-04-01 | 01.04.2015 | 01.04.2015 |        |        |
+------------+------------+------------+--------+--------+

一些日期列具有字符串格式的日期。现在我想在 level1、level2 和 level3 列中添加一些天数,并且需要将这些列与我的 where 子句中的其他日期进行比较。 下面是我向 level1、level2 和 level3 列添加一些天数的查询。

SELECT DATE_ADD(level1,INTERVAL 28 DAY) level1, DATE_ADD(STR_TO_DATE(level2,'%d.%m.%Y'),INTERVAL 28 DAY) level2, 
DATE_ADD(STR_TO_DATE(level3,'%d.%m.%Y'),INTERVAL 28 DAY) level3,level4,level5 
FROM stocks WHERE  stock= '4046228057941' AND
DATE_ADD(level1,INTERVAL 28 DAY)>='2015-04-01' AND
DATE_ADD(STR_TO_DATE(level2,'%d.%m.%Y'),INTERVAL 28 DAY) >='2015-04-01' AND
DATE_ADD(STR_TO_DATE(level3,'%d.%m.%Y'),INTERVAL 28 DAY) >='2015-04-01'


+------------+------------+------------+--------+--------+
| level1     | level2     | level3     | level4 | level5 |
+------------+------------+------------+--------+--------+
| 2015-04-29 | 2015-04-29 | 2015-04-29 |        |        |
+------------+------------+------------+--------+--------+

但我还需要比较 level4 和 level5 列。现在第 4 层和第 5 层是空的。但是当我将 level4 和 level5 比较添加到上述查询时,我得到的结果是空的。

SELECT DATE_ADD(level1,INTERVAL 28 DAY) level1, DATE_ADD(STR_TO_DATE(level2,'%d.%m.%Y'),INTERVAL 28 DAY) level2, 
DATE_ADD(STR_TO_DATE(level3,'%d.%m.%Y'),INTERVAL 28 DAY) level3,level4,level5 
FROM stocks WHERE  EAN = '4046228057941' AND
DATE_ADD(level1,INTERVAL 28 DAY)>='2015-04-01' AND
DATE_ADD(STR_TO_DATE(level2,'%d.%m.%Y'),INTERVAL 28 DAY) >='2015-04-01' AND
DATE_ADD(STR_TO_DATE(level3,'%d.%m.%Y'),INTERVAL 28 DAY) >='2015-04-01' AND
DATE(`level4`)='2015-04-01' AND DATE(`level5`)='2015-04-01'

但现在我想要的输出将是即使任何列为空我的查询需要跳过该空列并需要检查有价值的列。 我怎样才能做到这一点?任何帮助将不胜感激..

您可以只使用 OR 条件。

SELECT DATE_ADD(level1, INTERVAL 28 DAY) level1,
       DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL 28 DAY) level2,
       DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL 28 DAY) level3,
       level4,
       level5 
  FROM stocks 
 WHERE EAN = '4046228057941' 
   AND (level1 IS NULL OR DATE_ADD(level1, INTERVAL 28 DAY) >= '2015-04-01')
   AND (level2 IS NULL OR DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL 28 DAY) >= '2015-04-01')
   AND (level3 IS NULL OR DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL 28 DAY) >= '2015-04-01' )
   AND (level4 IS NULL OR DATE(`level4`) = '2015-04-01')
   AND (level5 IS NULL OR DATE(`level5`) = '2015-04-01')

请注意,如果您的 "empty columns" 不是空值,您应该使用其他条件。例如:

SELECT DATE_ADD(level1, INTERVAL 28 DAY) level1,
       DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL 28 DAY) level2,
       DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL 28 DAY) level3,
       level4,
       level5 
  FROM stocks 
 WHERE EAN = '4046228057941' 
   AND (LENGTH(level1) = 0 OR DATE_ADD(level1, INTERVAL 28 DAY) >= '2015-04-01')
   AND (LENGTH(level2) = 0 OR DATE_ADD(STR_TO_DATE(level2, '%d.%m.%Y'), INTERVAL 28 DAY) >= '2015-04-01')
   AND (LENGTH(level3) = 0 OR DATE_ADD(STR_TO_DATE(level3, '%d.%m.%Y'), INTERVAL 28 DAY) >= '2015-04-01' )
   AND (LENGTH(level4) = 0 OR DATE(`level4`) = '2015-04-01')
   AND (LENGTH(level5) = 0 OR DATE(`level5`) = '2015-04-01')