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

Why same postgres query is not working for double digit number?

我正在为我的应用程序使用 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"
    }');
    Select * from contacts;
    
    +====+==================================================================================================================================+
    | id | contact_data                                                                                                                     |
    +====+==================================================================================================================================+
    | 1  | {"tags": ["MOCK_DATA (4)"], "Email": "nk3ynman5@marriott.com", "reach": false, "Gender": "Male", "Interest": ["Dance"], "Last... |
    +----+----------------------------------------------------------------------------------------------------------------------------------+
    | 2  | {"ltv": "6", "City": "Bengaluru", "Email": "aaa@aa.com", "State": "Karnataka", "Country": "India", "latitude": 12.9715987, "L... |
    +----+----------------------------------------------------------------------------------------------------------------------------------+
    | 3  | {"ltv": "11", "Email": "sf3ortye8@ebay.co.uk", "reach": false, "Gender": "Female", "Country": "United States", "latitude": "3... |
    +----+----------------------------------------------------------------------------------------------------------------------------------+

我正在尝试获取 ltv 在 2 到 9 之间的 id。它给出了 1 条记录。这是正确的

    SELECT id from contacts where ( contact_data->> 'ltv' > '2' and contact_data->> 'ltv' < '9' );
    +====+
    | id |
    +====+
    | 2  |
    +----+

问题:

现在我正在尝试 2 到 12 之间,这应该会提供 2 条记录,但它会提供 0 个数据。

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

谁能告诉我这是什么问题。为什么我没有得到价值?这里是 sql-fiddle

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

在查询中对其进行强制转换以赋予其您想要的含义。

编辑:删除在 JSON 中使用数字,因为检索数字字段表单 JSON 似乎没有给出数值。

在 PostgreSQL 中 ->> 运算符将 return 一个 text 值。所以你也把它投在了各自的类型中。

尝试以下查询:

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

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