【问题标题】:SQL DB2 - How to SELECT or compare columns based on their name?SQL DB2 - 如何根据名称选择或比较列?
【发布时间】:2020-06-27 07:10:13
【问题描述】:

感谢您查看我的问题!

我正在尝试针对我们在工作场所遇到的一个非常具体的问题编写查询,但我似乎无法理解它。

短版:我需要能够通过名称来定位列,更具体地说,通过名称的一部分来定位,这将在我所有的列中保持一致需要合并或比较。

更多详情: 我们有(例如)5 个不同的调查。他们每个人都有很多问题,但其中一些问题是同一指标的一部分,我们需要创建一个通用字段来保留它。 “为什么”还有更多背景,但这对我们来说非常重要。

我们能够通过 COALESCE() 或 CASE 语句解决这个问题,但挑战在于,随着更多调查/调查版本的不断增长,我们的供应商不可避免地会为每个调查及其问题生成新列。

以这个例子为例,这是我们目前所做的并且效果很好:

CASE
   WHEN SURVEY_NAME = 'Service1' THEN SERV1_REC
   WHEN SURVEY_NAME = 'Notice1' THEN FNOL1_REC
   WHEN SURVEY_NAME = 'Status1' THEN STAT1_REC
   WHEN SURVEY_NAME = 'Sales1' THEN SALE1_REC
   WHEN SURVEY_NAME = 'Transfer1' THEN Null
   ELSE Null
END REC

还有这个效果很好的替代方案:

COALESCE(SERV1_REC, FNOL1_REC, STAT1_REC, SALE1_REC) as REC

但正如我所提到的,最终我们将有一个“SALE2_REC”,例如,我们将在同一个语句中同时需要它们。 我想创建一些不需要进入 SQL 并进行更改的东西。鉴于此特定的列将始终命名为“something#_REC”指标,有什么方法可以实现:

COALESCE(all columns named LIKE '%_REC') as REC

奖金! 相关,可能是解决同一问题的另一种方法: 是否还有办法实现这一目标?

SELECT (columns named LIKE '%_REC') FROM ...

非常感谢您的所有时间和关注。

-肯德尔

【问题讨论】:

  • 新问题应该在 ROW 中,而不是在 COLUMN 中。这就是你问题的根源。
  • 你肯定需要使用动态sql构造对应的select语句,执行,返回对应的结果集。此外,您需要一些服务表(带有字段 SURVEY_VALUE、REC_COLUMN_NAME)来动态构建案例表达式,以根据 SURVEY_NAME 列的值获取相应的 *REC 字段。我相信这可以通过表函数来完成。你需要这样的解决方案吗?

标签: sql dynamic db2 toad-data-point


【解决方案1】:

Db2 中的表和列信息在系统目录中进行管理。相关视图为SYSCAT.TABLESSYSCAT.COLUMNS。你可以写:

select colname, tabname from syscat.tables
where colname like some_expression
and syscat.tabname='MYTABLE

请注意,LIKE predicate 支持基于变量或标量函数结果的表达式。所以你可以将它与一些动态输入进行匹配。

您是否考虑过将更复杂的属性存储在 JSON 或 XML 值中? Db2 支持两者,您可以使用常规 SQL 语句查询这些值。

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2018-01-30
    • 1970-01-01
    相关资源
    最近更新 更多