我将以下行存储在我的表('DataScreen')中的JSONB列下('Results')
TASK: [rabbitmq | fail msg="Hostname has to resolve to IP address of api_interface"] ***
failed: [localhost] => (item={u'cmd': [u'getent', u'ahostsv4', u'DESKTOP'], u'end': u'2017-02-26 00:45:10.399323', u'stderr': u'', u'stdout': u'127.0.1.1 STREAM DESKTOP\n127.0.1.1 DGRAM \n127.0.1.1 RAW ', u'changed': False, u'rc': 0, 'item': 'localhost', u'warnings': [], u'delta': u'0:00:00.001585', 'invocation': {'module_name': u'command', 'module_complex_args': {}, 'module_args': u'getent ahostsv4 DESKTOP'}, 'stdout_lines': [u'127.0.1.1 STREAM DESKTOP', u'127.0.1.1 DGRAM ', u'127.0.1.1 RAW '], u'start': u'2017-02-26 00:45:10.397738'}) => {"failed": true, "item": {"changed": false, "cmd": ["getent", "ahostsv4", "DESKTOP"], "delta": "0:00:00.001585", "end": "2017-02-26 00:45:10.399323", "invocation": {"module_args": "getent ahostsv4 DESKTOP", "module_complex_args": {}, "module_name": "command"}, "item": "localhost", "rc": 0, "start": "2017-02-26 00:45:10.397738", "stderr": "", "stdout": "127.0.1.1 STREAM DESKTOP\n127.0.1.1 DGRAM \n127.0.1.1 RAW ", "stdout_lines": ["127.0.1.1 STREAM DESKTOP", "127.0.1.1 DGRAM ", "127.0.1.1 RAW "], "warnings": []}}
msg: Hostname has to resolve to IP address of api_interface
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/home/ravichandran/site.retry
localhost : ok=84 changed=11 unreachable=0 failed=1
这里,在这个JSON对象中,“Id”和“Handle”是整数属性,其他是字符串属性。
当我查询下面的表格时
{"Id":11,"Product":"Google Chrome","Handle":3091,"Description":"Google Chrome"}
{"Id":111,"Product":"Microsoft Sql","Handle":3092,"Description":"Microsoft Sql"}
{"Id":22,"Product":"Microsoft OneNote","Handle":3093,"Description":"Microsoft OneNote"}
{"Id":222,"Product":"Microsoft OneDrive","Handle":3094,"Description":"Microsoft OneDrive"}
我得到了不正确的结果,因为PostgreSql将所有内容视为文本列,因此根据文本进行排序,而不是整数。 因此它将结果作为
Select Results->>'Id' From DataScreen
order by Results->>'Id' ASC
而不是
11,111,22,222
我不想使用显式强制转换来检索下面的
11,22,111,222.
因为我不能确定列的数据类型,因为JSON结构将是动态的,并且键和值可能在下次更改。因此可能与另一个具有整数和字符串键的JSON相同。
我想要一些东西,以便JSONB列的Json结构中的整数只被视为整数而不是文本(字符串)。
如何编写查询以便在没有显式转换的情况下将Id和Handle检索为整数值而不是字符串?
答案 0 :(得分:0)
我认为你对id
字段的看法没有意义。你说,
(a)
id
只包含整数或(b)它包含字符串和整数。
我会说,
如果(a)那么数字排序是正确的。
如果(b)那么词汇排序是正确的。
但如果(a)一段时间然后(b)那么正确的顺序也会改变。并且 没有意义。想象一下:
对于当前数据库,您需要订单11,22,111,222
。然后你添加一行
{"Id":"aa","Product":"Microsoft OneDrive","Handle":3095,"Description":"Microsoft OneDrive"}
突然其他行的正确顺序变为11,111,22,222,aa
。 That
突然改变是困扰我的。
所以我要么期望一个词汇排序ab intio,要么将我的id
字段限制为整数并使用显式转换。
我能想到的其他选择都不实用。例如,您可以为<
字段创建自定义>
和id
实施,从而产生11,111,22,222,aa
。 (“按数值排序所有整数,按词法顺序排列所有字符串,并将所有整数放在字符串之前”)。
但这是很多工作(它涉及自定义数据类型,自定义强制转换函数和自定义运算符函数)并产生一些违反直觉的结果,例如: 11,111,22,222,0a,1a,2a,aa
(请注意0a
的位置等等。它们来自222
)。
希望,这有帮助;)
答案 1 :(得分:0)
如果Id
总是整数,您可以将其投放到精选部分,然后使用ORDER BY 1
:
select (Results->>'Id')::int From DataScreen order by 1 ASC