sqlite、生成的列和 SQLite
sqlite, generated columns and SQLite
我将带有原始 json 的 TEXT 列保存到 SQLite 数据库中。 json 模式不是唯一的。我想使用生成的列从 raw
列
中提取值
我可以处理多个列,每个列使用不同的路径来提取值
CREATE TABLE t (
raw TEXT,
c1 TEXT GENERATED ALWAYS AS (json_extract(raw, '$.field1')) VIRTUAL,
c2 TEXT GENERATED ALWAYS AS (json_extract(raw, '$.field2')) VIRTUAL
)
结果:
sqlite> select * from t;
┌────────────────────────────────────────┬────────┬────┐
│ raw │ c1 │ c2 │
├────────────────────────────────────────┼────────┼────┤
│ {"field1":"value1", "field3":"value2"} │ value1 │ │
└────────────────────────────────────────┴────────┴────┘
或者我可以将包含多个路径的单列传递给 json_extract
CREATE TABLE t1 (
raw TEXT,
c1 TEXT GENERATED ALWAYS AS (json_extract(raw, '$.field1', '$.field2')) VIRTUAL
)
结果
sqlite> select * from t1;
┌────────────────────────────────────────┬─────────────────┐
│ raw │ c1 │
├────────────────────────────────────────┼─────────────────┤
│ {"field1":"value1", "field3":"value2"} │ ["value1",null] │
└────────────────────────────────────────┴─────────────────┘
我更喜欢第二种方案,只有一个字段。但是 json_extract 有多个路径 return 一个包含路径不满足的 NULL 结果的数组 ["value1",null]
如何让表达式始终包含一个字符串,只有第一个 json_extract return 不为空?
答案:使用 COALESCE
CREATE TABLE t1 (
raw TEXT,
c1 TEXT GENERATED ALWAYS AS (COALESCE(json_extract(raw, '$.field1'), json_extract(raw,'$.field2'))) VIRTUAL
)
我将带有原始 json 的 TEXT 列保存到 SQLite 数据库中。 json 模式不是唯一的。我想使用生成的列从 raw
列
我可以处理多个列,每个列使用不同的路径来提取值
CREATE TABLE t (
raw TEXT,
c1 TEXT GENERATED ALWAYS AS (json_extract(raw, '$.field1')) VIRTUAL,
c2 TEXT GENERATED ALWAYS AS (json_extract(raw, '$.field2')) VIRTUAL
)
结果:
sqlite> select * from t;
┌────────────────────────────────────────┬────────┬────┐
│ raw │ c1 │ c2 │
├────────────────────────────────────────┼────────┼────┤
│ {"field1":"value1", "field3":"value2"} │ value1 │ │
└────────────────────────────────────────┴────────┴────┘
或者我可以将包含多个路径的单列传递给 json_extract
CREATE TABLE t1 (
raw TEXT,
c1 TEXT GENERATED ALWAYS AS (json_extract(raw, '$.field1', '$.field2')) VIRTUAL
)
结果
sqlite> select * from t1;
┌────────────────────────────────────────┬─────────────────┐
│ raw │ c1 │
├────────────────────────────────────────┼─────────────────┤
│ {"field1":"value1", "field3":"value2"} │ ["value1",null] │
└────────────────────────────────────────┴─────────────────┘
我更喜欢第二种方案,只有一个字段。但是 json_extract 有多个路径 return 一个包含路径不满足的 NULL 结果的数组 ["value1",null]
如何让表达式始终包含一个字符串,只有第一个 json_extract return 不为空?
答案:使用 COALESCE
CREATE TABLE t1 (
raw TEXT,
c1 TEXT GENERATED ALWAYS AS (COALESCE(json_extract(raw, '$.field1'), json_extract(raw,'$.field2'))) VIRTUAL
)