gpt4 book ai didi

SQL 列为 "View Column"

转载 作者:行者123 更新时间:2023-11-29 13:24:06 27 4
gpt4 key购买 nike

我有下表 security 证券:

  id   |   bbg_ticker     |  ticker  | currency | exchange |  type  
-------+------------------+----------+----------+----------+--------
1762 | 653 HK Equity | 653 | | HK | Equity
5734 | LO US Equity | LO | | US | Equity
6175 | H US Equity | H | | US | Equity
4563 | BDTY Index | BDTY | | | Index
6253 | MOA Comdty | MOA | | | Comdty
7414 | 1333 JP Equity | 1333 | | JP | Equity
7538 | 2377 TT Equity | 2377 | | TT | Equity

正如您所猜到的,Bloomberg 代码(bbg_ticker 列)实际上是以下内容的串联:

  • ticker + exchange + exchange 不为 null 时的类型
  • 股票代码 + 其他类型

这显然是不相关的数据重复。例如,有一天可能会在不更改其 bbg_ticker 的情况下更改证券的 exchange,这将导致数据完整性失败。

因为我目前正在重构我的数据库,所以我想知道我是否可以做一些类似“ View ”但带有列(而不是整个表)的事情。这个 View 将替换 bbg_ticker 列(将被命名为相同的),并且将被定义为例如(我知道以下请求是完全错误的):

CREATE COLUMN VIEW bbg_ticker
ON security AS (
ticker
|| (IF exchange IS NOT NULL THEN (' ' || exchange) ELSE '')
|| ' '
|| type
)
;

似乎不能以这种方式定义 VIEWS,但是您会看到另一种会导致相同结果的解决方案吗?我知道我可以使用检查约束和正则表达式,它们可以解决完整性问题,但不能解决重复问题。我的问题更多是关于有更好的解决方案。

我使用的是 PostgreSQL 9.5。

谢谢

最佳答案

您可以只从整个表创建一个 View :

CREATE VIEW improved_security AS
SELECT id, concat_ws(' ', ticker, exchange, type) AS bbg_ticker,
ticker, currency, exchange, type
FROM security;

concat_ws() 函数为您完成所有讨厌的字符串连接,使用适当的分隔符(在本例中为空格)并忽略 NULL

如果您需要维护名称 security 以便不破坏任何应用程序,那么您应该重命名该表(这将需要一个表锁定一段时间)然后创建查看名称 security 并授予适当的 View 权限并从表中撤消相同的权限。将所有这些都包装在一个事务中,这样您就不会在客户端出现任何错误,最多只是在放置或提取数据时出现短暂的延迟。

关于SQL 列为 "View Column",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36855312/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com