Sql 为什么相同的postgres查询不适用于两位数?

Sql 为什么相同的postgres查询不适用于两位数?,sql,database,postgresql,jsonb,Sql,Database,Postgresql,Jsonb,我正在使用postgres数据库进行我的应用程序 我有以下数据 create table contacts ( id int, contact_data jsonb ); insert into contacts values (1, '{ "tags": [ "MOCK_DATA (4)" ], "

我正在使用postgres数据库进行我的应用程序

我有以下数据

    create table contacts (
        id int,
        contact_data jsonb
    );
    
    insert into contacts values
    (1,   '{
        "tags": [
            "MOCK_DATA (4)"
        ],
        "Email": "nk3ynman5@marriott.com",
        "reach": false,
        "Gender": "Male",
        "Interest": [
            "Dance"
        ],
        "Last Name": "Kynman",
        "First Name": "Nicko"
    }'),
    (2,   '{
        "ltv": "6",
        "City": "Bengaluru",
        "Email": "aaa@aa.com",
        "State": "Karnataka",
        "Country": "India",
        "latitude": 12.9715987,
        "Last Name": "World",
        "longitude": 77.5945627,
        "First Name": "Helo"
    }'),
    (3,   '{
        "ltv": "11",
        "Email": "sf3ortye8@ebay.co.uk",
        "reach": false,
        "Gender": "Female",
        "Country": "United States",
        "latitude": "37.09024",
        "Last Name": "Fortye",
        "longitude": "-95.712891",
        "First Name": "Sissie"
    }');
我正在尝试获取ltv在2到9之间的id。它创造了一个记录。哪个是正确的

    SELECT id from contacts where ( contact_data->> 'ltv' > '2' and contact_data->> 'ltv' < '9' );
    +====+
    | id |
    +====+
    | 2  |
    +----+
从其中的联系人中选择id(联系人\u数据->>'ltv'>'2'和联系人\u数据->>'ltv'<'9');
+====+
|身份证|
+====+
| 2  |
+----+
问题:

现在我尝试在2到12之间,这应该给出2条记录,但它给出的是0个数据

SELECT id from contacts where ( contact_data->> 'ltv' > '2' and contact_data->> 'ltv' < '12' );
从其中的联系人中选择id(联系人\u数据->>'ltv'>'2'和联系人\u数据->>'ltv'<'12');

谁能告诉我这里有什么问题吗。为什么我得不到价值?这里是

看看
ltv的数据类型。它们是字符串而不是数字,因此按字典顺序排列

在查询中强制转换它,以赋予它您希望它具有的含义


编辑:在JSON中使用数字删除,因为从JSON检索数字字段似乎不会给出数字值。

查看
ltv
的数据类型。它们是字符串而不是数字,因此按字典顺序排列

在查询中强制转换它,以赋予它您希望它具有的含义


编辑:在JSON中使用数字删除,因为从JSON中检索数字字段似乎不会给出数值。

在PostgreSQL中
->
运算符将返回
文本
值。因此,您也在各自的类型中对其进行了转换

请尝试以下查询:

SELECT id 
from contacts 
where ( 
    (contact_data->> 'ltv')::int > 3 and 
    (contact_data->> 'ltv')::int < 12 
);

选择id
来自联系人
何处(
(联系人数据->>“ltv”)::int>3和
(联系人数据->>“ltv”)::int<12
);

唯一需要注意的是,
itv
必须只包含整数值,否则强制转换将抛出错误。

在PostgreSQL
->
中,运算符将返回一个
文本
值。因此,您也在各自的类型中对其进行了转换

请尝试以下查询:

SELECT id 
from contacts 
where ( 
    (contact_data->> 'ltv')::int > 3 and 
    (contact_data->> 'ltv')::int < 12 
);

选择id
来自联系人
何处(
(联系人数据->>“ltv”)::int>3和
(联系人数据->>“ltv”)::int<12
);

唯一需要注意的是,
itv
必须只包含整数值,否则强制转换将抛出错误。

我尝试了数字,但仍然没有显示任何数据。您到底尝试了什么?在JSON访问后尝试强制转换,正如此表可能会说,如果从JSON检索内容,您将始终获得
text
:因此,在插入时,我将LTV作为数字插入。并尝试在下面查询
从联系人中选择id,其中(联系人数据->>'ltv'>2和联系人数据->>'ltv'<12)这现在也可以工作了。您应该像这样尝试
从联系人中选择id,其中((联系人数据->>“ltv”)::int>3和(联系人数据->>“ltv”)::int<12)。无论您提供的是值
6
还是
“6”
。唯一一件事是在
ltv
中从不存储非整数值,我尝试了number,但它仍然没有显示任何数据。您到底尝试了什么?在JSON访问之后尝试强制转换,因为此表可能会说,如果您从JSON检索某个内容,您将始终获得
text
:因此在插入时,我将ltv插入为number。并尝试在下面查询
从联系人中选择id,其中(联系人数据->>'ltv'>2和联系人数据->>'ltv'<12)这现在也可以工作了。您应该像这样尝试
从联系人中选择id,其中((联系人数据->>“ltv”)::int>3和(联系人数据->>“ltv”)::int<12)。无论您提供的是值
6
还是
“6”
。唯一的东西永远不会在
ltv