【问题标题】:SQL JSON DATA FILTERSQL JSON 数据过滤器
【发布时间】:2022-01-25 20:02:20
【问题描述】:

我有一个表,其中有一列名为“data”,它以字符串的形式存储 json 数据,

id , data

1 {'field1': '123432', 'field2': 'TEST', 'field3': '', 'field4': 'JAMES'}

2 {'field1': '123412', 'field2': 'TEST 2', 'field3': 'TEST', 'field4': 'TESTER'}

选择“data”列的“field3”不为空的所有行的最佳方法是什么?

测试查询

CREATE TABLE my_test(id INT,data TextField  );

insert into my_test values
(1,"{'field1': '123432', 'field2':'TEST'}"),
(2,"{'field1': '322345', 'field2':'TEST 2'}");

谢谢。

【问题讨论】:

  • 你可以使用JSON_EXTRACT
  • 显示的值是 NOT 来自 MySQL 观察点的有效 JSON 值。
  • 遇到这种情况,该怎么办? @Akina
  • 请运行以下SHOW CREATE TABLE your_table_name; 并更新into your question。此外,包括用于将数据插入表中的查询。
  • @FanoFN 查询已更新

标签: python mysql sql


【解决方案1】:

如果你的数据是正确的 json 格式,也许这样的东西会有所帮助:

select JSON_UNQUOTE(JSON_EXTRACT(data, '$.field3'))
from test_tbl
where  JSON_UNQUOTE(JSON_EXTRACT(data, '$.field3')) !='' ;





CREATE TABLE test_tbl(
id INT,
data json  );

insert into test_tbl values
(1,'{"field1": "123432", "field2":"TEST", "field3": "", "field4": "JAMES"}'),
(2,'{"field1": "123432", "field2":"TEST", "field3": "TEST", "field4": "JAMES"}');

结果:

JSON_UNQUOTE(JSON_EXTRACT(data, '$.field3'))
TEST

Demo

【讨论】:

  • 在我的情况下,我的数据不是有效的mysql json,那我该怎么办?
【解决方案2】:

您的数据存储方式确实看起来像JSON,但不幸的是它不是一个有效的方式。单引号应该是双引号。根据您的 MySQL 版本,您可以使用 JSON_VALID 函数验证 JSON 数据是否有效:

SELECT *,
       JSON_VALID(data) AS check_if_json_data_is_valid
FROM my_test;

这是您将获得的结果(使用您的确切数据样本)

id data check_if_json_data_is_valid
1 {'field1': '123432', 'field2':'TEST', 'field3': ''} 0
2 {'field1': '322345', 'field2':'TEST 2', 'field3': 'TEST'} 0

如您所见,check_if_json_data_is_valid 返回0(零) 表示它无效。现在,由于您的数据已经是 JSON 格式(尽管有引号),一个简单的解决方案是用双引号替换单引号,因此:

SELECT *,
       REPLACE(data,'\'','"') AS replaced_quotes,
       JSON_VALID(REPLACE(data,'\'','"')) AS check_if_json_data_is_valid
FROM my_test;

这将返回以下结果:

id data replaced_quotes check_if_json_data_is_valid
1 {'field1': '123432', 'field2':'TEST', 'field3': ''} {"field1": "123432", "field2":"TEST", "field3": ""} 1
2 {'field1': '322345', 'field2':'TEST 2', 'field3': 'TEST'} {"field1": "322345", "field2":"TEST 2", "field3": "TEST"} 1

将单引号替换为双引号后,check_if_json_data_is_valid 现在返回 1,因此它现在是一个有效的 JSON 值。您接下来可以做的是将REPLACE(data,'\'','"') 用于您的操作:

SELECT *,
       JSON_UNQUOTE(JSON_EXTRACT(REPLACE(data,'\'','"'), '$.field3')) AS field3
      FROM my_test
HAVING field3 != ''

Demo fiddle

对于INSERT 查询,无论您是手动执行还是通过代码生成,请确保将单引号更改为双引号,这样您就不需要在@ 上执行REPLACE() 987654339@ 列了。并确保使用JSON_VALID 检查您的JSON 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2017-07-07
    相关资源
    最近更新 更多