Class TGetTableColumn

Object
gudusoft.gsqlparser.util.TGetTableColumn

public class TGetTableColumn extends Object
用于从SQL语句中提取表和列信息的工具类。

表输出规则(基于 ETableSource 类型)

默认行为

默认情况下,此工具仅输出具有表名(getTableName() != null)且不在排除列表中的表。 以下 ETableSource 类型的表在默认情况下不会出现在输出的表列表中:

以下 ETableSource 类型的表出现在默认输出中(如果 getTableName() 不为 null):

控制选项

1. showCTE 选项

控制是否输出 CTE(公用表表达式)相关的表:

  • showCTE = false(默认):CTE 表不会出现在输出中
  • showCTE = true:CTE 表会出现在输出中

2. onlyPhysicalTables 选项

控制是否仅输出物理表(与 TSQLResolver2ResultFormatter 的 onlyPhysicalTables 选项兼容):

如何输出所有类型的表

要在输出中包含CTE表,请设置 showCTE = true:


 TGetTableColumn getTableColumn = new TGetTableColumn(EDbVendor.dbvoracle);
 getTableColumn.showCTE = true;  // 启用CTE表的输出
 getTableColumn.runText(sql);
 

注意:即使设置了 showCTE = true,以下类型的表仍然不会出现在表列表中:

ETableSource 类型与输出对照表

注意:此表显示的是默认配置下的行为。showUnnest、showPivotTable、showLateralView 默认都为 true, 所以即使 onlyPhysicalTables=true,这三种表类型默认也会被输出。

ETableSource 类型默认输出showCTE=trueonlyPhysicalTables=true (默认 show*=true)原因
objectname✓ 输出✓ 输出✓ 输出普通基础表
subquery✗ 不输出✗ 不输出✗ 不输出显式排除
openquery✗ 不输出✗ 不输出✗ 不输出显式排除
function✗ 不输出✗ 不输出✗ 不输出显式排除
CTE 表✗ 不输出✓ 输出✗ 不输出由 showCTE 控制,onlyPhysicalTables 排除
unnest✗ 不输出✗ 不输出✓ 输出由 showUnnest 控制(默认 true)
tableExpr✗ 不输出✗ 不输出✗ 不输出getTableName() 为 null
pivoted_table✓ 输出✓ 输出✓ 输出由 showPivotTable 控制(默认 true)
lateralView✓ 输出✓ 输出✓ 输出由 showLateralView 控制(默认 true)

其他相关选项

  • showCTE - 设置为 true 时,CTE表会包含在输出中
  • onlyPhysicalTables - 设置为 true 时,仅输出 objectname 类型的物理表
  • showUnnest - 设置为 true 时(默认),即使 onlyPhysicalTables=true,UNNEST 表也会被输出
  • showPivotTable - 设置为 true 时(默认),即使 onlyPhysicalTables=true,PIVOT 表也会被输出
  • showLateralView - 设置为 true 时(默认),即使 onlyPhysicalTables=true,LATERAL VIEW 表也会被输出
  • showColumnsOfCTE - 设置为 true 时,显示CTE中的列
  • showTableEffect - 设置为 true 时,显示表的操作类型(SELECT、INSERT、UPDATE、DELETE等)
  • showDetail - 设置为 true 时,显示详细信息
  • showSummary - 设置为 true 时(默认),显示汇总信息

示例


 // 示例1:仅获取物理表(默认行为)
 TGetTableColumn gtc = new TGetTableColumn(EDbVendor.dbvoracle);
 gtc.runText("SELECT * FROM employees e, (SELECT * FROM departments) d");
 // 输出仅包含: employees(子查询 departments 不会出现)

 // 示例2:包含CTE表
 TGetTableColumn gtc2 = new TGetTableColumn(EDbVendor.dbvoracle);
 gtc2.showCTE = true;
 gtc2.runText("WITH cte AS (SELECT * FROM t1) SELECT * FROM cte, t2");
 // 输出包含: t1, t2, cte(因为 showCTE = true)

 // 示例3:仅输出物理表,但保留 PIVOT 表(默认行为)
 TGetTableColumn gtc3 = new TGetTableColumn(EDbVendor.dbvoracle);
 gtc3.onlyPhysicalTables = true;
 gtc3.runText("SELECT * FROM t1 PIVOT (SUM(amount) FOR month IN ('Jan', 'Feb'))");
 // 输出包含: t1 和 PIVOT 表(因为 showPivotTable 默认为 true)

 // 示例4:仅输出物理表,排除 PIVOT 表
 TGetTableColumn gtc4 = new TGetTableColumn(EDbVendor.dbvoracle);
 gtc4.onlyPhysicalTables = true;
 gtc4.showPivotTable = false;  // 排除 PIVOT 表
 gtc4.runText("SELECT * FROM t1 PIVOT (SUM(amount) FOR month IN ('Jan', 'Feb'))");
 // 输出仅包含: t1(PIVOT 表被排除)
 
See Also: