这是一个选择对象的简单雪花查询:
sf = connection.cursor()
sf.execute(f"""
SELECT OBJECT_CONSTRUCT('foo', 'bar')
""")
for row in sf.fetchall():
yield row
当我运行此命令时,响应似乎是:
['{\n"foo": "bar"\n}']
带有空白字符等。理想情况下,它会以字典的形式返回,但如果不可能的话,它可以不带空格地返回吗?
Snowflake 使用换行符和缩进格式化 JSON。这将使它返回时没有换行、缩进或空格:
sf.execute(f"""
SELECT OBJECT_CONSTRUCT('foo', 'bar')::string
""")
在问题的示例中,Snowflake SQL 返回一个 VARIANT。该转换是在 Python 级别完成的。如果你想控制 Snowflake SQL 中的转换,你可以使用 TO_JSON,它目前不添加行结尾或空格(或者使用 :: 或 CAST 的隐式转换,它应该在幕后执行相同的操作)。
SELECT
OBJECT_CONSTRUCT('foo', 'bar') as obj,
TO_JSON(obj) as obj_string,
-- implicit conversions, not the best practice
obj::STRING,
CAST(obj as STRING)
-- result: {"foo":"bar"}
我需要相反的东西,所以我在 Javascript 中编写了一个原始函数,因为 JSON.stringify 可以更好地控制从对象(VARIANT)到字符串的转换。
CREATE OR REPLACE FUNCTION UDF_JSON_TO_STRING(P_JSON VARIANT)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
/*
Makes JSON a well-formatted string as opposed to the default Snowflake function TO_JSON
*/
AS '
return JSON.stringify(P_JSON, null, 2)
';
现在我可以处理漂亮且可读的 JSON 字符串。调试大型 JSON 时,优势变得明显。
SELECT UDF_JSON_TO_STRING(OBJECT_CONSTRUCT('foo', 'bar'));
/* result: {
"foo": "bar"
} */