SQL DB2 - 如何 SELECT 或根据名称比较列?

SQL DB2 - How to SELECT or compare columns based on their name?

感谢您检查我的问题!

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

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

更多详情: 我们有(例如)5 种不同的调查。他们每个人都有很多问题,但有些问题是同一指标的一部分,我们需要创建一个通用字段来保存它。 "why" 有更多背景知识,但目前对我们来说非常重要。

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

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

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 ...

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

-肯德尔

Table和Db2中的列信息是在系统目录中管理的。相关观点为SYSCAT.TABLES and SYSCAT.COLUMNS。你可以这样写:

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

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

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