+-
SQL:如果字段不为空,如何按字段排序,否则使用另一个字段
我想按dtModified(修改的日期时间)对我的帖子排序(如果不为null(修改后的b4)),否则按dtPosted(发布的日期时间)排序
最佳答案
看来我每周都会在这里提三遍这样的建议,也许我应该放弃然后放手:-)不,我不这么认为:

如果希望数据库很好地扩展,请不要在列计算(或按子句排序)中使用逐行函数.您应该检查特定情况下的性能(度量标准,不要猜测),但是在读取数据库时进行计算通常会影响您的扩展能力(这对您的地址簿数据库无关紧要,但是我工作的商店数量很多数据的).

“如何使我的数据库运行得更快?”的数目问题远远超过“我如何使用更少的空间?”那些.这是一条牺牲磁盘空间以提高性能的理想途径.

正确的时间是在数据更改时进行计算.这样,更改成本将在所有读取中摊销.

我的建议是创建另一个列,例如dtLastAction来包含排序值,然后使用插入/更新触发器将其设置为与dtModified(如果不为null)相同,或者与dtPosted相同(如果dtModified为null).从技术上讲,这违反了3NF,但是如果您知道自己在做什么就可以了,并且触发器可以确保这种情况下的数据一致性.

然后在dtLastAction列上建立索引,以提高查询速度,而在插入和更新过程中以(较少的)额外工作量(较少)付出代价.我之所以说得少,是因为绝大多数数据库表的读取频率高于写入的频率(显然,如果您的特殊情况是非常罕见的例外之一,则此方法无用).

或者,对于这种特殊情况,可以在创建条目时将dtModified和dtPosted设置为相同的值,这意味着dtModified永远不会为null.您仍然可以检测到由于这两个日期时间值相同而从未被修改的帖子.

点击查看更多相关文章

转载注明原文:SQL:如果字段不为空,如何按字段排序,否则使用另一个字段 - 乐贴网