即使没有找到使用默认值模拟正确结果集的行,我也希望返回MySQL结果集。
这样我就不必在显示这些数据时有任何逻辑......我可以把它推出来。
我想做的是总是返回3个仓库... 000 CAL RET,当找不到任何值时,值为0。
如果要添加新仓库,我希望能够修改此仓库以包含该仓库。
这里是:
http://sqlfiddle.com/#!9/e94bc
我想在RET仓库中返回另一行,所有列都包含零。
如果你查询另一个不存在的ItemCode,我想看到所有3行000 CAL RET,每列中的值为零。
作为奖励,我也希望始终返回0而不是(NULL)作为值。
我已经搜索了答案,但似乎无法找到我需要的答案。
谢谢!
答案 0 :(得分: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
,默认行将匹配。
答案 1 :(得分: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组数据进行合并,对于每一列,你应该从mastertable和数据库中获得0,如果数据库中的值为null,它将会从主人那里拿走0'表
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'
答案 2 :(得分: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
。
我希望这有帮助!