从单独的列构建视图列

Posted

技术标签:

【中文标题】从单独的列构建视图列【英文标题】:Building a view column out of separate columns 【发布时间】:2008-10-22 12:25:14 【问题描述】:

在我们的数据库中,我们设置了一个系统来跟踪应用程序。我们有一个 bool 列,指示应用程序是否被批准。然后还有另一列指示申请是否被拒绝。如果两列都不为真,则认为该申请处于待处理状态。

是否有任何简单的方法可以在视图中将它们合并为一个值(比如一个 tinyint 或一个字符串,上面写着“已批准”、“拒绝”或“待定”)?或者这需要像表值函数这样的东西吗?

更新:很难选择答案,因为它们都很有帮助。自从他第一次发布以来,我就和baldy's一起去。

【问题讨论】:

【参考方案1】:

你可以使用这样的case语句:

select case 
  when Approved = 1 then 'Approved'
  when Denied = 1 then 'Denied'
  else 'Pending'
  end 'Status'

【讨论】:

【参考方案2】:

由于您同时存储 Approved 和 Denied 值,因此您必须担心排序(如果两者都为 True,则排序优先?)。你应该绝对只把它放到一个视图中,这样你以后就不必重复这个逻辑了。

根据 NTFS 权限,我总是更喜欢 Deny 优先:

CASE 
    --Denied has precedence
    WHEN Denied = 1 THEN 'Denied'
    WHEN Approved = 1 THEN 'Approved'
    ELSE 'Pending'
END as Status

除非您有其他要求排除它,否则我更喜欢 Baldy 关于可为空的 int 或检查约束 tinyint 列的建议。

【讨论】:

我喜欢 NTFS 风格的逻辑。如果修复基表,CHAR/VARCHAR,默认“Pending”,CHECK 约束“approved”,“denied”和“pending”。 varchar 也可以——但是,我个人更希望翻译是 UI 或映射表。【参考方案3】:

您可以在查询中使用 case 语句: 选择案例批准时 1 然后 '批准' else ...

案例语句可以嵌套,因此您可以深入研究不同的选项。

为什么不使用具有 3 个不同值的 int 列,或者您甚至可以使用一个启用 null 的 bool 列。当为 null 时,它处于待处理状态,1 已批准,0 已拒绝。

【讨论】:

以上是关于从单独的列构建视图列的主要内容,如果未能解决你的问题,请参考以下文章

从包含来自单独列的数据的列中选择数据

Hbase构建二级索引的一些解决方案

如何在更新单独表中的列的视图上创建触发器?

hbase构建二级索引的几种解决方案

EF4.1 - 在单独的构建服务器上使用 TFS 团队构建的预生成视图是不是存在问题?

当数组很大时,在Scala中的Spark Dataframe中从数组列创建单独的列[重复]