【问题标题】:How to generate Stackoverflow table markdown from Snowflake如何从雪花生成 Stackoverflow 表降价
【发布时间】:2022-07-13 07:13:59
【问题描述】:
Stackoverflow 支持table markdown。例如,要显示这样的表格:
| N_NATIONKEY |
N_NAME |
N_REGIONKEY |
| 0 |
ALGERIA |
0 |
| 1 |
ARGENTINA |
1 |
| 2 |
BRAZIL |
1 |
| 3 |
CANADA |
1 |
| 4 |
EGYPT |
4 |
你可以这样写代码:
|N_NATIONKEY|N_NAME|N_REGIONKEY|
|---:|:---|---:|
|0|ALGERIA|0|
|1|ARGENTINA|1|
|2|BRAZIL|1|
|3|CANADA|1|
|4|EGYPT|4|
运行 Snowflake 查询时自动生成 Stackoverflow 表 markdown 会节省大量时间。
【问题讨论】:
标签:
snowflake-cloud-data-platform
【解决方案1】:
以下存储过程接受查询字符串或查询 ID(它将自动检测它是哪一个)并将表结果作为 Stackoverflow 表降价返回。它会自动将数字和日期向右对齐,字符串、数组和对象向左对齐,其他类型默认居中。它支持您可以传递给它的任何查询。如果 SQL 包含单引号,最好使用$$ 来终止传递给过程的字符串。您可以使用此脚本创建过程并对其进行测试:
create or replace procedure STACKOVERFLOW_TABLE("queryOrQueryId" string)
returns string
language javascript
execute as caller
as
$$
var [rs, i, c, row, props] = [null, 0, 0, 0, {}];
queryOrQueryId = queryOrQueryId.trim();
if (isUUID(queryOrQueryId)){
rs = snowflake.execute({sqlText:`select * from table(result_scan('${queryOrQueryId}'))`});
} else {
rs = snowflake.execute({sqlText:`${queryOrQueryId}`});
}
props.columnCount = rs.getColumnCount();
for(i = 1; i <= props.columnCount; i++){
props["col" + i + "Name"] = rs.getColumnName(i);
props["col" + i + "Type"] = rs.getColumnType(i);
}
var table = getHeader(props);
while(rs.next()){
row = "|";
for(c = 1; c <= props.columnCount; c++){
row += escapeMarkup(rs.getColumnValueAsString(c)) + "|";
}
table += "\n" + row;
}
return table;
//------ End main function. Start of helper functions.
function escapeMarkup(s){
s = s.replace(/\\/g, "\\\\");
s = s.replaceAll('|', '\\|');
s = s.replace(/\s+/g, " ");
return s;
}
function getHeader(props){
s = "|";
for (var i = 1; i <= props.columnCount; i++){
s += props["col" + i + "Name"] + "|";
}
s += "\n";
for (var i = 1; i <= props.columnCount; i++){
switch(props["col" + i + "Type"]) {
case 'number':
s += '|---:';
break;
case 'string':
s += '|:---';
break;
case 'date':
s += '|---:';
break;
case 'json':
s += '|:---';
break;
default:
s += '|:---:';
}
}
return s + "|";
}
function isUUID(str){
const regexExp = /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/gi;
return regexExp.test(str);
}
$$;
-- Usage type 1, a simple query:
call stackoverflow_table($$ select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION limit 5 $$);
-- Usage type 2, a query ID:
select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION limit 5;
set quid = (select last_query_id());
call stackoverflow_table($quid);