我有一个表,persons它包含两列,一个id和一个基于 JSONB 的data列(这个表只是为了演示目的而制作的,以使用 PostgreSQL 的 JSON 支持)。
现在,假设它包含两条记录:
1, { name: 'John', age: 30 }
2, { name: 'Jane', age: 20 }
Run Code Online (Sandbox Code Playgroud)
现在,假设我想得到每个 25 岁以上的人的名字。我尝试过的是:
select data->'name' as name from persons where data->'age' > 25
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会导致错误。我可以通过使用->>代替来解决它->,但是比较不再按预期工作,因为不是比较数字,而是比较它们作为字符串的表示:
select data->'name' as name from persons where data->>'age' > '25'
Run Code Online (Sandbox Code Playgroud)
然后我发现我实际上可以通过使用->和强制转换来解决这个问题int:
select data->'name' as name from persons where cast(data->'age' as int) > 25
Run Code Online (Sandbox Code Playgroud)
这有效,但我必须知道实际类型并不是那么好(ageJSON 文档中的类型是number无论如何,那么为什么 PostgreSQL …
使用 PostgreSQL 9.5 我想确保当我运行一个SELECT语句时我得到一致的结果,即如果表在SELECT运行时被修改,我想获得SELECT启动时有效的状态。
基本上,它就像:拍摄一张表的快照,并且在拍摄快照时不允许更新表,然后交付快照,同时再次允许更新。
如果我正确理解隔离级别,REPEATABLE READ这就是我要找的,不是吗?
现在我的问题是:如何SELECT使用REPEATABLE READ隔离级别运行?或者我错过了什么,我的方法是错误的?我将如何解决这个问题?
postgresql select isolation-level snapshot-isolation postgresql-9.5