我知道 SQLite 没有布尔数据类型,但对于 JSON 列,我想将值设置为真正的布尔值而不是 0/1 假布尔值,但 SQLite 似乎总是将其设置为 int .
例子:
sqlite> create table test (j text);
sqlite> insert into test values ('{"b":true}');
确保我们有有效的 JSON 并提取值:
sqlite> select json_valid(j) from test;
1
sqlite> select json_extract(j, '$.b') from tests;
1
好的,因此提取一个值会将其转换为“本机”SQLite 数据类型,这是有道理的,并且在文档中有所记录json_extract()
,但设置它也可以,这有点烦人:
sqlite> select json_set(j, '$.b', true) from test;
{"b":1}
sqlite> select json_set(j, '$.b', 'true') from test;
{"b":"true"}
我可以在我的应用程序中编写一些代码来将 0/1 识别为布尔值并将其转换,但我不希望仅仅因为一个数据库迁移需要将一些 JSON 字段从一列移动到另一列,因为它引入了一些复杂性行(我需要更改一些类型,然后还修改一些当前仅接受bool
多态类型的通用函数)。
有没有办法将它设置为真正的 JSON 布尔值{"b": true}
?
我正在使用 SQLite 3.34.1(3.35 更改日志没有提到任何关于 JSON 的内容,所以我认为它在最新版本中没有变化)。
我当前的解决方法是在设置值后使用字符串替换:
update test set j = replace(replace(j,
'"b":0', '"b":false'),
'"b":1', '"b":true');
但是嗯。
要让 'true' 被识别为实际的 JSON 对象
true
,可以使用该json()
函数,例如参考: