如何查询此结构:
// 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
答案 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 |
+----+---------+---------+---------------------+