解析时标识符无效 json

invalid identifier while parsing json

我正在编译一个 dbt 基础模型。目前我在下面收到此错误。第 6 行看起来与上面的其他行相同。可能是我无法发现的小语法错误。

15:40:22  Database Error in model base_datacenter_handling_unit (models/l10_staging_datacenter/base_unit.sql)
15:40:22    000904 (42000): SQL compilation error: error line 6 at position 3
15:40:22    invalid identifier 'VALUE'
15:40:22    compiled SQL at target/run/dbt/models/l10_staging_datacenter/base_unit.sql

我的文件是这样的:

SELECT 
    JSON_DATA:"key"::text AS KEY 
    , value:"description"::text AS DESCRIPTION 
  , value:"globalHandlingUnitId"::text AS GLOBAL_HANDLING_UNIT_ID
  , value:"tareWeight"::NUMBER(38,0) AS TARTE_WEIGHT
  , value:"tareWeight_unit"::text AS TARTE_WEIGHT_UNIT
  , value:"width"::NUMBER(38,0) AS WIDTH
  , value:"width_unit"::text AS WIDTH_UNIT
  , value:"length"::NUMBER(38,0) AS LENGTH
    , value:"validFrom"::TIMESTAMP_NTZ AS VALID_FROM_TS_UTC
    , value:"validTo"::TIMESTAMP_NTZ AS VALID_TO_TS_UTC
    , value:"lastModified"::TIMESTAMP_NTZ AS LAST_MODIFIED_TS_UTC
  , value:"status"::text AS STATUS
    , md5(KEY::STRING || MASTERCLIENT_ID) AS HANDLING_UNIT_KEY --different logic than in POSTGRESDWH! 
    ,MASTERCLIENT_ID
    ,{{ extract_masterclientname_clause('META_FILENAME') }} AS MASTERCLIENT_NAME
    ,META_ROW_NUM
  ,META_FILENAME
  ,META_LOAD_TS_UTC
  ,META_FILE_TS_UTC
  ,CASE WHEN {{table_dedup_clause('HANDLING_UNIT_KEY')}} 
    THEN True
    ELSE False
  END AS IS_RECORD_CURRENT
FROM {{ source('INGEST_DATACENTER', 'HANDLING_UNIT') }} src
QUALIFY {{table_dedup_clause('HANDLING_UNIT_KEY')}}

也可能是因为 STRING 类型 md5(KEY::STRING || MASTERCLIENT_ID) 我正在使用 md5 但我有另一个文件,它基于相同的模式但它不会抛出错误 tho:

SELECT 
    JSON_DATA:"issueId"::NUMBER(38,0) AS ISSUE_ID 
    , value:"slaName"::text AS SLA_NAME
    , value:"slaTimeLeft"::NUMBER(38,0) AS SLA_TIME_USED_SECONDS
    , md5(ISSUE_ID::STRING || SLA_NAME) AS ISSUE_SLA_ID  
    ,MASTERCLIENT_ID
    ,{{ extract_masterclientname_clause('META_FILENAME') }} AS MASTERCLIENT_NAME
    ,META_ROW_NUM
  ,META_FILENAME
  ,META_LOAD_TS_UTC
  ,META_FILE_TS_UTC
,CASE WHEN {{table_dedup_clause('ISSUE_SLA_ID')}}
    THEN True
    ELSE False
  END AS IS_RECORD_CURRENT
FROM {{ source('INGEST_EMS', 'ISSUES') }} src
    , lateral flatten ( input => JSON_DATA:slas)
QUALIFY {{table_dedup_clause('ISSUE_SLA_ID')}}

我看不出两者之间有什么显着差异

最可能的原因是列未命名为“tareWeight_unit”。 Snowflake 以大写形式创建列名,无论它们是如何编写的 除非 原始创建语句将列名放在双引号中(例如“MyColumn”),在这种情况下它将创建列名指定具体情况。使用 SHOW COLUMNS IN TABLE 并检查实际的列名。

value 是第二个 SQL 中的 FLATTEN 的输出列。但不是你的第一个。

在这里为每个 table 设置一个别名,并在每次使用时使用它,您会看到类似

的内容
SELECT t.json_data:"key",
   f.value:"json_prop_name"
FROM table AS t;

就像,f 从哪里来...