为什么相同的 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
必须只包含整数值,否则转换会抛出错误。
我正在为我的应用程序使用 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
必须只包含整数值,否则转换会抛出错误。