如何在Dyalog APL中获取SQL查询结果的列名?
解决Dyalog APL获取SQL查询结果列名的问题
方法1:从sqapl的SQA.Do返回值中直接提取列元数据
SQA.Do的返回结果是嵌套数组,其中第2个元素包含了查询结果的列元数据,结构和SQA.Columns的返回一致,可直接提取列名:
SQA.Init '' SQA.Connect 'C1' 'MySQL' 'psw' 'userID' ⍝ 执行查询并保留完整结果 fullResult ← SQA.Do 'C1' qry ⍝ 提取列名(第2个元素的第4列即为列名) columnNames ← (2⊃fullResult)[;4] ⍝ 提取结果表数据 tbl2 ← ⊃⊃(3⊃fullResult)
该方法无需额外查询,直接利用SQA.Do返回的元数据,是最直接的解决方案。
方法2:包装查询为临时表后使用SQA.Columns
若需复用SQA.Columns函数,可将原查询包装为子查询生成临时表,在同一连接会话中查询列信息:
⍝ 包装原查询为临时表查询 tempQry ← 'SELECT * FROM (' , qry , ') AS temp_query' ⍝ 执行查询确保临时表存在(返回空结果即可) ⊃SQA.Do 'C1' tempQry ⍝ 使用SQA.Columns获取临时表的列名 columnNames ← (2⊃SQA.Columns 'C1' 'temp_query')[;4] ⍝ 执行临时表查询获取完整数据 tbl2 ← ⊃⊃(3⊃SQA.Do 'C1' tempQry)
注意:临时表仅在当前连接会话中存在,需保证列查询和数据查询在同一连接内完成。
方法3:扩展LOADDATA的LoadSQL函数获取列名
LoadSQL默认仅返回数据,可查看其内部实现(输入)DISPLAY LoadSQL),自定义封装函数让它同时返回数据和列名:
⍝ 自定义封装函数,同时返回数据与列名 LoadSQLWithCols ← { connParams ← ⊃⍵ qry ← ⊃1↓⍵ fullResult ← SQA.Do (⊃connParams) qry data ← ⊃⊃(3⊃fullResult) cols ← (2⊃fullResult)[;4] ⍝ 返回嵌套数组:[数据, 列名] data,cols } ⍝ 使用自定义函数 result ← LoadSQLWithCols ('MySQL' 'psw' 'userID') qry tbl1 ← ⊃result columnNames ← 1↓result
内容的提问来源于stack exchange,提问作者T.P.
相关产品推荐
相关产品推荐

