为什么已知类型会产生运行时错误,而推断类型会产生空值?

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_accessarr[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