如何获取雪花中 table 主键的列表?
How to get list of table primary keys in snowflake?
我想获取雪花列表中 table 的所有主键。
我用了
SHOW PRIMARY KEYS IN TABLE t1
但输出是一组列:
"created_on" "database_name" "schema_name" "table_name" "column_name" "key_sequence" "constraint_name" "comment"
而我只需要 column_name 列。
我尝试这样做:
select a.* from (SHOW PRIMARY KEYS IN TABLE t1) a
但是我得到了这个错误:
SQL Error [1003] [42000]: SQL compilation error:
syntax error line 1 at position 17 unexpected 'SHOW'.
如果有人有想法,请帮忙。谢谢。
您可以使用RESULT_SCAN函数来处理SHOW命令的输出:
https://docs.snowflake.com/en/sql-reference/functions/result_scan.html
SHOW PRIMARY KEYS IN TABLE t1;
SELECT * FROM table(RESULT_SCAN( LAST_QUERY_ID() ));
另一个示例:
SHOW PRIMARY KEYS IN TABLE test1;
select last_query_id();
This is the result:
-------------------
019c7ab2-3200-9e9b-0000-b4550014773e
然后我将它与RESULT_SCAN一起使用:
SELECT * FROM table(RESULT_SCAN( '019c7ab2-3200-9e9b-0000-b4550014773e'));
请注意,last_query_id 总是 return 当前会话中的最后一个查询。它不 return 与其他会话一起执行的查询 ID。
不久前,我为一位需要编程方式 return table 的 PK 列的客户编写了一个 UDTF(用户定义的 Table 函数)作为 table。这可能与您要执行的操作一致,但如果您希望将 return 作为列表而不是 table.
,则可能需要进行一些调整
您可以在此处查看其工作原理的示例 https://snowflake.pavlik.us/index.php/2020/07/29/getting-snowflake-primary-key-columns-as-a-table/
/********************************************************************************************************
* *
* User defined table function (UDTF) to get primary keys for a table. *
* *
* @param {string}: TABLE_DDL The DDL for the table to get the PKs. Usually use get_ddl. *
* @return {table}: A table with the columns comprising the table's primary key *
* *
********************************************************************************************************/
create or replace function GET_PK_COLUMNS(TABLE_DDL string)
returns table (PK_COLUMN string)
language javascript
as
$$
{
processRow: function get_params(row, rowWriter, context){
var pkCols = getPKs(row.TABLE_DDL);
for (i = 0; i < pkCols.length; i++) {
rowWriter.writeRow({PK_COLUMN: pkCols[i]});
}
function getPKs(tableDDL) {
var c;
var keyword = "primary key";
var ins = -1;
var s = tableDDL.split("\n");
for (var i = 0; i < s.length; i++) {
ins = s[i].indexOf(keyword);
if (ins != -1) {
var colList = s[i].substring(ins + keyword.length);
colList = colList.replace("(", "");
colList = colList.replace(")", "");
var colArray = colList.split(",");
for (pkc = 0; c < colArray.length; pkc++) {
colArray[pkc] = colArray[pkc].trim();
}
return colArray;
}
}
return []; // No PK
}
}
}
$$;
我使用非常简单的基于 SQL 的 UDTF 来完成此操作:
CREATE OR ALTER FUNCTION admin.get_primary_key(p_table_nm VARCHAR)
RETURNS TABLE(column_name VARCHAR, ordinal_position int)
AS
WITH t AS (select get_ddl('TABLE', p_table_nm) tbl_ddl)
, t1 AS (
SELECT POSITION('primary key (', tbl_ddl) + 13 pos
, SUBSTR(tbl_ddl, pos, POSITION(')', tbl_ddl, pos) - pos ) str
FROM t
)
SELECT x.value column_name
, x.index ordinal_position
FROM t1
, LATERAL SPLIT_TO_TABLE(t1.str, ',') x
;
然后您可以在 SQL 语句中查询:
select *
FROM TABLE(admin.get_primary_key('<your table name>'));
我想获取雪花列表中 table 的所有主键。 我用了
SHOW PRIMARY KEYS IN TABLE t1
但输出是一组列:
"created_on" "database_name" "schema_name" "table_name" "column_name" "key_sequence" "constraint_name" "comment"
而我只需要 column_name 列。 我尝试这样做:
select a.* from (SHOW PRIMARY KEYS IN TABLE t1) a
但是我得到了这个错误:
SQL Error [1003] [42000]: SQL compilation error:
syntax error line 1 at position 17 unexpected 'SHOW'.
如果有人有想法,请帮忙。谢谢。
您可以使用RESULT_SCAN函数来处理SHOW命令的输出:
https://docs.snowflake.com/en/sql-reference/functions/result_scan.html
SHOW PRIMARY KEYS IN TABLE t1;
SELECT * FROM table(RESULT_SCAN( LAST_QUERY_ID() ));
另一个示例:
SHOW PRIMARY KEYS IN TABLE test1;
select last_query_id();
This is the result:
-------------------
019c7ab2-3200-9e9b-0000-b4550014773e
然后我将它与RESULT_SCAN一起使用:
SELECT * FROM table(RESULT_SCAN( '019c7ab2-3200-9e9b-0000-b4550014773e'));
请注意,last_query_id 总是 return 当前会话中的最后一个查询。它不 return 与其他会话一起执行的查询 ID。
不久前,我为一位需要编程方式 return table 的 PK 列的客户编写了一个 UDTF(用户定义的 Table 函数)作为 table。这可能与您要执行的操作一致,但如果您希望将 return 作为列表而不是 table.
,则可能需要进行一些调整您可以在此处查看其工作原理的示例 https://snowflake.pavlik.us/index.php/2020/07/29/getting-snowflake-primary-key-columns-as-a-table/
/********************************************************************************************************
* *
* User defined table function (UDTF) to get primary keys for a table. *
* *
* @param {string}: TABLE_DDL The DDL for the table to get the PKs. Usually use get_ddl. *
* @return {table}: A table with the columns comprising the table's primary key *
* *
********************************************************************************************************/
create or replace function GET_PK_COLUMNS(TABLE_DDL string)
returns table (PK_COLUMN string)
language javascript
as
$$
{
processRow: function get_params(row, rowWriter, context){
var pkCols = getPKs(row.TABLE_DDL);
for (i = 0; i < pkCols.length; i++) {
rowWriter.writeRow({PK_COLUMN: pkCols[i]});
}
function getPKs(tableDDL) {
var c;
var keyword = "primary key";
var ins = -1;
var s = tableDDL.split("\n");
for (var i = 0; i < s.length; i++) {
ins = s[i].indexOf(keyword);
if (ins != -1) {
var colList = s[i].substring(ins + keyword.length);
colList = colList.replace("(", "");
colList = colList.replace(")", "");
var colArray = colList.split(",");
for (pkc = 0; c < colArray.length; pkc++) {
colArray[pkc] = colArray[pkc].trim();
}
return colArray;
}
}
return []; // No PK
}
}
}
$$;
我使用非常简单的基于 SQL 的 UDTF 来完成此操作:
CREATE OR ALTER FUNCTION admin.get_primary_key(p_table_nm VARCHAR)
RETURNS TABLE(column_name VARCHAR, ordinal_position int)
AS
WITH t AS (select get_ddl('TABLE', p_table_nm) tbl_ddl)
, t1 AS (
SELECT POSITION('primary key (', tbl_ddl) + 13 pos
, SUBSTR(tbl_ddl, pos, POSITION(')', tbl_ddl, pos) - pos ) str
FROM t
)
SELECT x.value column_name
, x.index ordinal_position
FROM t1
, LATERAL SPLIT_TO_TABLE(t1.str, ',') x
;
然后您可以在 SQL 语句中查询:
select *
FROM TABLE(admin.get_primary_key('<your table name>'));