防止在mysql视图中出现NULL,反规范化

Posted

技术标签:

【中文标题】防止在mysql视图中出现NULL,反规范化【英文标题】:prevent NULL in mysql view, de-normalization 【发布时间】:2010-07-16 13:21:21 【问题描述】:

我很乐意做这样的事情,但当然要使用有效的语法:)

MIN(CASE WHEN col=2 
THEN CASE WHEN answer IS NULL THEN 0 ELSE answer END END)

我试图阻止视图获取 NULL 值并改用零。 这是创建视图的 SELECT 查询:

SELECT result,question_id,
MIN(CASE WHEN col=1
THEN answer
END) AS col1,
MIN(CASE WHEN col=2 
THEN answer
END) AS col2,
MIN(CASE WHEN col=3
THEN answer
END) AS col3
FROM answers 
GROUP by result,question_id

基本上我得到了一个不错的结果,看起来像这样

result   question_id   col1   col2   col3
1            2          10     20      70
2            2          80     20     NULL
3            3          0     100       0

我没有任何性能问题,并且原始表会定期更新,这就是为什么我喜欢保留视图而不是 sp。您看到的表格分散了调查概率的调查的关系结构。每行的列必须加起来为 100。如果有人真的确定某事,例如col3 不会发生,他可以在其他表单字段中填写 0 或将该字段留空。表单验证器仅检查所有加起来是否为 100。如果该字段留空,则关系表中没有任何条目,因此分散视图写入 NULL。

我很想让它写一个“0”,但我不知道怎么做!感谢您提前提出任何建议!

【问题讨论】:

【参考方案1】:

您正在寻找IFNULL(..something...,0)


显然必须把它拼出来:

IFNULL(MIN(CASE WHEN col=3 THEN answer END),0)

【讨论】:

我应该在哪里使用该代码,“明显”不起作用:... THEN IFNULL(answer,0) :( 问题是当用户使用原始表时没有条目将其留空,根本没有记录,这就是视图变为 NULL 的原因,而不是因为原始表中的值是 NULL。 +1 用于拼写 :) 。感谢您的时间 Wrikken。顺便说一句,我发现了一个非常“奇怪”的行为。当我将原始查询更改为 MAX(CASE WHEN col=2 THEN answer ELSE 0) 时,它也起作用了,但我不明白为什么 MAX / MIN 突然产生了影响。换句话说,您的解决方案当然更好..但我不明白我发生了什么... ELSE 0 将防止结果集中出现 NULL 以供选择,除非答案列具有 NULL 值【参考方案2】:
SELECT name AS Name, category AS Category, IF(winter>500, "Sells", "Slow") AS Trend FROM sales;

那是来自http://www.java2s.com/Code/SQL/Flow-Control/UseIFinselectclause.htm

【讨论】:

以上是关于防止在mysql视图中出现NULL,反规范化的主要内容,如果未能解决你的问题,请参考以下文章

12:企业规范约束-MySQL

如何对 Kafka 中的数据进行反规范化?

《团队-科学计算器-代码设计规范》

DRF入门规范

MySQL中数据中设计中的范式与反范式

《MySQL高级篇》九数据库的设计规范