我有下表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
)实际上是连接:
这显然是无关紧要的数据重复。例如,有一天可能会更改安全exchange
而不更改其bbg_ticker
,这会导致数据完整性失败。
由于我正在重构我的数据库,我想知道我是否可以做一些像#" 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上。
谢谢
答案 0 :(得分:1)
您可以从整个表格中创建一个视图:
CREATE VIEW improved_security AS
SELECT id, concat_ws(' ', ticker, exchange, type) AS bbg_ticker,
ticker, currency, exchange, type
FROM security;
concat_ws()
函数为您执行所有令人讨厌的字符串连接,使用适当的分隔符(在本例中为空格)并忽略NULL
s。
如果您需要维护名称security
以便不破坏任何应用程序,那么您应该重命名该表(这将需要在短时间内锁定表),然后使用命名security
并为视图授予适当的权限,并从表中撤消相同的权限。将这一切全部包含在一个事务中,这样你就不会在客户端出现任何错误,最多只是推迟或拉动数据。