SQL列为"查看列"

时间:2016-04-26 04:33:24

标签: sql postgresql view

我有下表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 + type
  • ticker + type else

这显然是无关紧要的数据重复。例如,有一天可能会更改安全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上。

谢谢

1 个答案:

答案 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并为视图授予适当的权限,并从表中撤消相同的权限。将这一切全部包含在一个事务中,这样你就不会在客户端出现任何错误,最多只是推迟或拉动数据。