PostgreSql查询将Int视为字符串数据类型

时间:2017-02-25 19:35:27

标签: postgresql jsonb querying

我将以下行存储在我的表('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检索为整数值而不是字符串?

2 个答案:

答案 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,aaThat突然改变是困扰我的。

所以我要么期望一个词汇排序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