MySQL查询>选择将来的行并检查特定列是否已填充并匹配变量>如果匹配变量,则使用其他列

时间:2014-10-28 15:48:37

标签: mysql

如何查询此结构:

// table
column1 | column2 | datetime_column

我想选择不在过去的每一行(及其所有列),其中column1不为null +其内容与$ value匹配。仅当column1为null时,检查column2内容是否与$ value匹配,否则不选择行。

这是我得到的:

SELECT * FROM table WHERE datetime_column > NOW() AND ( column1 = "$value" OR column2 = "$value" )

当然这会占用column1或column2匹配$ value的所有行。如果条件允许,可以使用提示如何使用SQL。

示例(假设column1-2可为空)

// dynamic variable
$value = 'foo';

       column1 | column2 | datetime_column

row1 = foo     | bar     | 2013-12-01 10:00:00
row2 = NULL    | foo     | 2013-12-02 11:00:00
row3 = baz     | foo     | 2013-12-03 12:00:00
row4 = foo     | bar     | 2014-12-01 10:00:00
row5 = NULL    | foo     | 2014-12-02 11:00:00
row6 = baz     | foo     | 2014-12-03 12:00:00

获取的行应该是

row4 + row5

3 个答案:

答案 0 :(得分:1)

你应该看看CASE。

SELECT 
   *,
   CASE
     WHEN column1 = "$value" THEN column1
     WHEN column2 = "$value" THEN column2
   END AS value
FROM table 
WHERE datetime_column > NOW() 
AND ( column1 = "$value" OR column2 = "$value" )

如果您只想要该值,请忽略星号。

答案 1 :(得分:0)

如果我理解你的需要是正确的(对于column1来说无关紧要),我相信以下查询将得到你想要的。

SELECT * 
FROM table 
WHERE datetime_column > NOW() AND (column1 = "$value" OR column1 is null AND column2 = "$value")

上面的查询说,“给我来自'table'的行,其中column1等于$ value或者column1没有值,column2等于$ value。”

答案 2 :(得分:0)

  DROP TABLE IF EXISTS my_table;

  CREATE TABLE my_table
  (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  ,column1 VARCHAR(12) NULL
  ,column2 VARCHAR(12) NULL
  ,datetime DATETIME NOT NULL
  );

  INSERT INTO my_table VALUES
  (1 ,'foo','bar','2013-12-01 10:00:00'),
  (2 , NULL,'foo','2013-12-02 11:00:00'),
  (3 ,'baz','foo','2013-12-03 12:00:00'),
  (4 ,'foo','bar','2014-12-01 10:00:00'),
  (5 , NULL,'foo','2014-12-02 11:00:00'),
  (6 ,'baz','foo','2014-12-03 12:00:00');

  SELECT * FROM my_table WHERE 'foo' = COALESCE(column1,column2) AND datetime > NOW();
  +----+---------+---------+---------------------+
  | id | column1 | column2 | datetime            |
  +----+---------+---------+---------------------+
  |  4 | foo     | bar     | 2014-12-01 10:00:00 |
  |  5 | NULL    | foo     | 2014-12-02 11:00:00 |
  +----+---------+---------+---------------------+