标识符子句

描述

将常量 STRING 表达式转换为 SQL 对象名称。 此子句的目的是允许在 SQL 语句中模板化标识符,而不会带来 SQL 注入攻击的风险。 通常,此子句与参数标记作为参数一起使用。

语法

IDENTIFIER ( strExpr )

参数

返回值

一个(合格的)标识符,可以用作:

示例

这些示例使用命名参数标记来模板化查询。

// 使用参数标记创建一个表。
spark.sql("CREATE TABLE IDENTIFIER(:mytab)(c1 INT)", args = Map("mytab" -> "tab1")).show()
spark.sql("DESCRIBE IDENTIFIER(:mytab)", args = Map("mytab" -> "tab1")).show()
+--------+---------+-------+
|col_name|data_type|comment|
+--------+---------+-------+
| c1| int| NULL|
+--------+---------+-------+
// 修改一个具有固定模式和参数化表名称的表。 
spark.sql("ALTER TABLE IDENTIFIER('default.' || :mytab) ADD COLUMN c2 INT", args = Map("mytab" -> "tab1")).show()
spark.sql("DESCRIBE IDENTIFIER(:mytab)", args = Map("mytab" -> "default.tab1")).show()
+--------+---------+-------+
|col_name|data_type|comment|
+--------+---------+-------+
| c1| int| NULL|
| c2| int| NULL|
+--------+---------+-------+
// 在查询中对表的参数化引用。这个表名是合格的并使用反引号。
spark.sql("SELECT * FROM IDENTIFIER(:mytab)", args = Map("mytab" -> "`default`.`tab1`")).show()
+---+---+
| c1| c2|
+---+---+
+---+---+
// 你不能为IDENTIFIER子句提供合格名或将其用作合格名。
spark.sql("SELECT * FROM myschema.IDENTIFIER(:mytab)", args = Map("mytab" -> "`tab1`")).show()
[INVALID_SQL_SYNTAX.INVALID_TABLE_VALUED_FUNC_NAME] `myschema`.`IDENTIFIER`.
spark.sql("SELECT * FROM IDENTIFIER(:myschema).mytab", args = Map("mychema" -> "`default`")).show()
[PARSE_SYNTAX_ERROR]
// 删除一个具有单独模式和表参数的表。
spark.sql("DROP TABLE IDENTIFIER(:myschema || '.' || :mytab)", args = Map("myschema" -> "default", "mytab" -> "tab1")).show()
// 参数化列引用
spark.sql("SELECT IDENTIFIER(:col) FROM VALUES(1) AS T(c1)", args = Map("col" -> "t.c1")).show()
+---+
| c1|
+---+
| 1|
+---+
// 将函数名称作为参数传入
spark.sql("SELECT IDENTIFIER(:func)(-1)", args = Map("func" -> "abs")).show();
+-------+
|abs(-1)|
+-------+
| 1|
+-------+