【问题标题】:Pattern matching based on variable name for variable selection in a Postgres query?基于变量名称的模式匹配以在 Postgres 查询中选择变量?
【发布时间】:2019-09-05 23:10:49
【问题描述】:

我正在尝试在 Postgres 中查询一些数据,我想知道如何使用某种模式匹配而不仅仅是选择行 - 例如SELECT * FROM schema.tablename WHERE varname ~ 'phrase' - 但要在 SELECT 语句中选择列,特别是根据这些列的通用名称来选择。

我有一张表格,其中包含许多年来的比率估计值 - 例如,每年采摘的苹果 - 以及每年的上下 95% 置信区间。 (作为参考,每个估计和 95% CI 都来自不同的来源——准确地说是一份书面报告;这些来源是我的行,表格描述了每个来源的各个方面。根据下面的评论,我认为它是重要的是读者要知道,这个关系数据库中的分析单位是一份书面报告,其中对每年采摘的东西有不同的估计——一张桌子上的苹果,另一张桌子上的橙子,三分之一的梨。)

所以在这张表中,每一年都有三列/变量:

rate_1994 low_95_1994 high_95_1994

问题是,CI 大多为空 - 它们没有被填写。在我的查询中,我真的只是想提取每年的费率:所有以 rate_ 开头的变量。如何在我的 SELECT 声明中表达这一点?

我正在尝试使用 regexp_matches 来执行此操作,但我不断收到错误消息。

我已经在 StackOverflow 上做了一些探索,我觉得它甚至可能是不可能的,但我正在努力确定。如果不可能,很容易将表格分成两个新表格:一个只包含费率,另一个包含 CI。

(为了记录,我看过这样的帖子: Selecting all columns that start with XXX using a wildcard?)

提前致谢!

【问题讨论】:

  • 这是一个糟糕的数据设计。您应该有一个表格,其中有一列用于期间,另一列用于值。
  • @stickybit 我不关注。你能说得更具体点吗?
  • 不是为每年添加一个新列,而是有一个表格并为每年添加一行。使用WHERE year LIKE 'rate%' 或类似名称很容易在其中进行搜索。
  • @stickybit 啊,我明白了,谢谢。这是有道理的,但问题在于,整个数据库所围绕的实体是一组书面报告,对同一现象有不同的估计。例如,报告 A 估计了 1996 年和 2002 年采摘的苹果,而报告 B 估计了 2000 年和 2008 年的苹果。表 1 是关于例如苹果和表 2 是关于采摘的橙子。例如,在表 2 中,报告 B 可能没有橘子的估计值,但 A 有,而不同的报告,报告 C 也有。当我着手组织这个数据库时,这就是有意义的方式。
  • 为带有 id 和它的水果的报告创建另一个表格。向具有值的表添加另一个标识报告的列。问题解决了,关系方式。

标签: database postgresql


【解决方案1】:

如果您基本上要问的是是否可以根据执行时条件动态选择列

没有。

但是,您可以使用 PL/SQL 将查询构建为字符串,然后使用 EXECUTE IMMEDIATE 执行它。

【讨论】:

  • 谢谢。正如我上面与@stickybit 的讨论所示,我认为可能更多地与我设计数据库的方式有关,而不是与 Postgres 的查询能力有关。我必须比我做得更好(我正在研究数据库设计最佳实践)。我可能会在明天发布另一个关于这个问题的问题,在我对此进行了一段时间之后,但也许我在这里意识到的主要事情是我是一个完整的新手,在我之前我还有很多关于构建 db 的知识深入查询它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2017-07-19
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多