我在表中的信息中有pd_id
NULL
doc_id doc_title doc_order pg_id
14 a.zip 1 NULL
15 b.zip 2 NULL
12 c.zip 1 16
13 d.zip 2 16
3 f.doc 3 16
4 g.doc 4 16
当我想用pg_id 16查询项目时,我这样做,
SELECT *
FROM root_documents
WHERE root_documents.pg_id = '16'
当我想要查询没有任何pd_id的项目时,我会这样做,
SELECT *
FROM root_documents
WHERE root_documents.pg_id IS NULL
我发现两个查询是重复的,所以我尝试这个,
SELECT *
FROM root_documents
WHERE (root_documents.pg_id = ? OR root_documents.pg_id IS NULL)
所以,当我想用pg_id 16,
查询项目时,我想得到这个结果doc_id doc_title doc_order pg_id
12 c.zip 1 16
13 d.zip 2 16
3 f.doc 3 16
4 g.doc 4 16
但是我得到了所有人的内容!
doc_id doc_title doc_order pg_id
14 a.zip 1 NULL
15 b.zip 2 NULL
12 c.zip 1 16
13 d.zip 2 16
3 f.doc 3 16
4 g.doc 4 16
如何解决此问题,
SELECT *
FROM root_documents
WHERE (root_documents.pg_id = ? OR root_documents.pg_id IS NULL)
或者我必须像往常一样重复查询?
修改
当我将一个参数传递给占位符时,这个答案对我来说很奇怪:
SELECT *
FROM root_documents
WHERE (root_documents.pg_id = '16' OR (root_documents.pg_id IS NULL AND '16' IS NULL))
当没有参数时,
SELECT *
FROM root_documents
WHERE (root_documents.pg_id = NULL OR (root_documents.pg_id IS NULL AND NULL IS NULL))
请注意,当没有返回任何值时,我会将NULL
传递给placeholder
。
答案 0 :(得分:2)
抱歉:您正在使用MYSQL ......无视。
一种方法是:
SELECT *
FROM root_documents
WHERE isnull(root_documents.pg_id, -1) = ?
-1或您希望在[root_documents.pg_id]中找到的任何值。然后,当您要为该值搜索NULL查询时。
答案 1 :(得分:0)
你可以设置?当你想要那个pg_id时给一个数字,或者当你想要那个为空的时候给一个字符串IS NULL
。
答案 2 :(得分:0)
我想你想要这样的东西:
SELECT *
FROM root_documents
WHERE (root_documents.pg_id = ? OR (root_documents.pg_id IS NULL AND ? IS NULL))
答案 3 :(得分:0)
我认为以下内容适合您(已更新):
SELECT *
FROM root_documents r1
WHERE (r1.pg_id = ?
OR (NOT EXISTS
(SELECT * FROM FROM root_documents r2
WHERE r2.pg_id = ? )
AND r1.pg_id IS NULL)