2015-09-24 2 views
0

Я хочу вернуть набор результатов MySQL, даже если не найдено ни строк, которые имитируют правильный набор результатов со значениями по умолчанию.MySQL возвращает значения, если строки не найдены

Это значит, что мне не нужно иметь какую-либо логику в моем отображении этих данных ... Я могу просто вытолкнуть ее.

То, что я хотел бы сделать, всегда возвращается 3 Склады ... 000 CAL RET со значениями 0, когда ничего не найдено.

Если новый склад когда-либо добавлен, я бы надеялся, что смогу его модифицировать и включить этот склад.

Здесь идет:

http://sqlfiddle.com/#!9/e94bc

Я хотел бы вернуть другую строку для RET склад с нулями во всех колонках.

Если вы запрашиваете другой ItemCode, который не существует, я хочу увидеть все 3 строки 000 CAL RET с нулевыми значениями в каждом столбце.

как бонус Я также хотел бы всегда возвращать 0 и не (NULL) в качестве значения.

Я искал ответы, но не могу найти то, что мне нужно.

Спасибо!

+0

Ваша скрипка сломана (пожалуйста, постройте схему.) – Eric

+0

Думаю, я ее исправил. Я имею в виду скрипку. – Yourguide

ответ

1
SELECT querytype, col1, col2, col3, ... 
FROM (SELECT 1 AS querytype, col1, col2, col3, ... 
     FROM YourTable 
     WHERE ... 
     UNION ALL 
     SELECT 2 AS querytype, 0, 0, 0, ... 
     UNION ALL 
     SELECT 2 AS querytype, 0, 0, 0, ... 
     UNION ALL 
     SELECT 2 AS querytype, 0, 0, 0, ...) AS x 
HAVING querytype = MIN(querytype) 

Все перед первым UNION ALL это ваш обычный запрос, но с добавлением querytype колонны. Если этот запрос возвращает что-либо, MIN(querytype) будет 1, и эти строки будут соответствовать заданию HAVING. В противном случае MIN(querytype) будет 2, и строки по умолчанию будут совпадать.

+0

У вас есть крошечная ошибка в вашем запросе, она должна быть 'SELECT querytype, col1, col2, col3, ...'. В противном случае querytype не будет найден. – Jacobian

0

вы можете создать основную таблицу ваших складов с 0 в каждом столбце.

CREATE TABLE ItemWarehouseMaster 
    (`Warehouse` varchar(3), `QOH` int, `QPO` int, `QSO` int, `QBO` int,`ItemCode` varchar(8)) 
; 

INSERT INTO ItemWarehouseMaster 
    (`Warehouse`, `QOH`, `QPO`, `QSO`, `QBO`, `ItemCode`) 

    ('CAL', 0, 0, 0, 0, 0), 
    ('RET', 0, 0, 0, 0, 0), 
    ('000', 0, 0, 0, 0, 0), 

тогда ваш запрос может присоединиться к этой таблице и выполнить сливается на 2 наборов данных для каждого столбца вы должны иметь 0 из mastertable и значения из базы данных, если значение из базы данных имеет значение null, он будет принимать 0 из таблицы «master».

SELECT 
    w.Warehouse, 
    coalesce (w.QOH,Mast.QOH), 
    coalesce (w.QSO,Mast.QSO), 
    coalesce (w.QPO,Mast.QPO), 
    coalesce (w.QBO,Mast.QBO) 
FROM 
    ItemWarehouseMaster Mast 
left join 
    ItemWarehouse w on 
w.warehouse = mast.warehouse 

And w.itemcode = '10052IP' 
+0

На самом деле это кажется настолько близким к работе, но когда я запрашиваю его с кодом товара, который не существует, я не получаю никаких значений. Также он не заполняет пустые строки из того, что я могу сказать. – Yourguide

+0

Ах, где должно быть частью соединения вместо этого, поэтому он только присоединяется к тем записям, которые соответствуют строке. – pancho018

0

Я только что столкнулся с такой же ситуацией, и мне удалось вернуть значения аналогично тому, как описано Barmar, немного более простой, хотя.

SELECT mycol FROM (
    SELECT mycol FROM mytable WHERE condcol = 'some value' 
    UNION SELECT 'hardcoded value' 
) alias 
LIMIT 1; 

Если первый запрос не возвращает ни одну строку, второй всегда возвращает твердое кодированное значение. Если вам нужно вернуть более жесткие кодированные строки, просто добавьте UNION SELECT 'another value' столько раз, сколько вам нужно. Оператор LIMIT в конце позволяет вам убедиться, что вы не вернете жестко закодированные строки, если найдете реальные строки.

Обратите внимание, что ваш исходный запрос станет производным запросом и должен иметь псевдоним. В противном случае вы увидите эту ошибку: Error in query (1248): Every derived table must have its own alias. Надеюсь, это поможет!

Смежные вопросы