MySQL: объединение двух повторяющихся запросов - PullRequest
0 голосов
/ 19 августа 2011

У меня есть это в информации в таблице, где иногда 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

Как я могу это исправитьquery,

SELECT * 
FROM root_documents 
WHERE (root_documents.pg_id = ? OR root_documents.pg_id IS NULL)

Или я должен повторить запрос, как обычно делаю?

EDIT:

Этот ответ мне кажется страннымкогда у меня есть параметр, который нужно передать в заполнитель:

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, когда значение не возвращается.

Ответы [ 4 ]

2 голосов
/ 19 августа 2011

Извините: вы используете MYSQL ... Не учитывать.

Один из способов заключается в следующем:

SELECT * 
FROM root_documents 
WHERE isnull(root_documents.pg_id, -1) = ?

-1 или любое значение, которое вы никогда не ожидаете найти в [root_documents.pg_id],Затем, когда вы хотите найти NULL-запрос для этого значения.

0 голосов
/ 19 августа 2011

Я думаю, что следующее должно работать для вас ( обновлено ):

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)
0 голосов
/ 19 августа 2011

Я думаю, вы хотите что-то вроде этого:

SELECT * 
FROM root_documents 
WHERE (root_documents.pg_id = ? OR (root_documents.pg_id IS NULL AND ? IS NULL))
0 голосов
/ 19 августа 2011

Вы могли бы установить?на число, когда вы хотите этот pg_id, или на строку IS NULL, когда вы хотите те, которые являются нулевыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...