JSON_EXTRACT 和 mysql 局部变量做错了

Doing something wrong with JSON_EXTRACT and mysql local variable

MySQL 查询需要一些帮助。

我有一个名为 custom_fields 的 table,具有属性 id、user_id、名称、值等

name和values都是string类型,有时JSON也可以以string的形式存储

Requirement:
I need to list out all the unique user_id which satisfies below conditions
1) name must be starting with street_address_
2) value is a hash but stored as a string. if the country code is in ('us', 'in')

这是示例记录。

id: 90489,
user_id: 30207,
name: "street_address_billing",
value:"{\"street_address1\":\"401 Lenora Street\",\"street_address2\":\"\",\"city\":\"Belltown\",\"locality\":\"Seattlel\",\"province\":\"WA\",\"postal_code\":\"111\",\"country_code\":\"us\"}",
deleted_at: nil,
active: true

这是我正在尝试的查询。但它不起作用。我没有错误,但它也没有给出任何结果。而不是 in 如果我使用 = 和单个值,有时它会给出值。

SELECT id,user_id, @addr:= replace(replace(replace(replace(value, ':“', ':"'), '”,', '",'), '”}', '"}'), '{“' , '{"'), JSON_EXTRACT(@addr, '$.country_code') as billing_country
FROM `custom_fields` WHERE `custom_fields`.`active` = TRUE AND (name REGEXP '^street_address_')
AND JSON_EXTRACT(@addr, '$.country_code') in ('us', 'in');s

尽管 SELECT 语法将 select-列表放在 WHERE 子句之上,但首先评估 WHERE 条件,以限制由查询编辑的行 return。然后仅针对这些行,计算 select 列表中的表达式。因此,您在 select 列表中定义的变量不能在 WHERE 子句中使用。

因此您需要在 WHERE 条件中引用列本身:

SELECT id,user_id, JSON_UNQUOTE(JSON_EXTRACT(value, '$.country_code')) AS billing_country
FROM `custom_fields` WHERE `custom_fields`.`active` = TRUE AND (name REGEXP '^street_address_')
AND JSON_UNQUOTE(JSON_EXTRACT(value, '$.country_code')) IN ('us', 'in');

您还需要使用 JSON_UNQUOTE(),因为 JSON_EXTRACT() 的 return 值不是纯字符串 — 它是恰好是标量的 JSON 文档。所以它会 return "us".

我删除了所有 replace() 内容,因为您不需要它。如果您使用 JSON 数据,您应该将其存储在 JSON 列中,这将拒绝包含智能引号字符的无效 JSON。