为什么已知类型会产生运行时错误,而推断类型会产生空值?
Why does a known type produce a runtime error but an inferred type produces a null value?
让我们以 BigQuery 中的以下示例为例,但它在我见过的所有其他数据库中都是相同的:
with tbl as (
select [1,2,3] as arr,
'{"IDS": [1,2,3], "Author": "Shakespeare", "Title": "Romeo & Juliet"}' as json_str,
STRUCT('Hamlet' AS title, 'Shakespeare' AS author) as struct_val
) select
arr[OFFSET(0)],
struct_val.title,
JSON_QUERY(json_str, "$.IDS[0][0].invalid")
from tbl
这个returns:
1 - Hamlet - null
换句话说,如果 json 访问命中无效路径,它 return 将 null
。但是,当执行 struct_val.invalid_access
或 arr[OFFSET(100)]
之类的操作时,它会给出实际的运行时错误,例如:
Error1: Array index 100 is out of bounds (overflow)
Error2: Field name invalid_access does not exist in STRUCT<title STRING, author STRING>
我的问题是为什么一种形式给出 null
值而另一种形式给出 return 运行时错误?我的想法是 return null
对他们来说会更一致,但显然是知识比我多得多的人构建了这些系统,所以很好奇为什么会这样......
您要查找的信息可能在设计文档中,但实际答案更有可能是 Serg 提到的内容。
当你在做arr[OFFSET(100)]
时,你是在告诉引擎你想访问那个位置的元素,如果没有这样的索引,就会出现错误,换句话说,引擎无法执行要求的内容。在 JSON_QUERY
中,您要求引擎在 JSON-like 字符串中查找值,引擎可以执行所请求的内容,将 json 路径与字符串进行比较,如果什么都找不到,它 returns 空。
这是在数据库上下文之外经常讨论的问题,例如:https://softwareengineering.stackexchange.com/questions/228287/returning-null-or-a-empty-value-throw-exception
让我们以 BigQuery 中的以下示例为例,但它在我见过的所有其他数据库中都是相同的:
with tbl as (
select [1,2,3] as arr,
'{"IDS": [1,2,3], "Author": "Shakespeare", "Title": "Romeo & Juliet"}' as json_str,
STRUCT('Hamlet' AS title, 'Shakespeare' AS author) as struct_val
) select
arr[OFFSET(0)],
struct_val.title,
JSON_QUERY(json_str, "$.IDS[0][0].invalid")
from tbl
这个returns:
1 - Hamlet - null
换句话说,如果 json 访问命中无效路径,它 return 将 null
。但是,当执行 struct_val.invalid_access
或 arr[OFFSET(100)]
之类的操作时,它会给出实际的运行时错误,例如:
Error1: Array index 100 is out of bounds (overflow)
Error2: Field name invalid_access does not exist in STRUCT<title STRING, author STRING>
我的问题是为什么一种形式给出 null
值而另一种形式给出 return 运行时错误?我的想法是 return null
对他们来说会更一致,但显然是知识比我多得多的人构建了这些系统,所以很好奇为什么会这样......
您要查找的信息可能在设计文档中,但实际答案更有可能是 Serg 提到的内容。
当你在做arr[OFFSET(100)]
时,你是在告诉引擎你想访问那个位置的元素,如果没有这样的索引,就会出现错误,换句话说,引擎无法执行要求的内容。在 JSON_QUERY
中,您要求引擎在 JSON-like 字符串中查找值,引擎可以执行所请求的内容,将 json 路径与字符串进行比较,如果什么都找不到,它 returns 空。
这是在数据库上下文之外经常讨论的问题,例如:https://softwareengineering.stackexchange.com/questions/228287/returning-null-or-a-empty-value-throw-exception