如何在mysql列中搜索json编码的值?

时间:2013-02-28 14:29:03

标签: mysql json search

我在mysql列(extraData)中将一些额外的表单数据存储为json。

示例数据

{"1":{"name":"sadsdaf ","surname":"sdafa","occupation":"sdaas","email":"dsasdaf@asdf.nl","barcode":"052355491"},"2":{"name":"sadafd","surname":"sdafa","occupation":"sddaf","email":"sda@daf.nl","barcode":"052355492"}}

我想做一个搜索查询,它也搜索存储在json编码字段中的条形码?所以不仅仅是这个

$sql = "SELECT name FROM visitors WHERE barcode = '".$barcode."'";

但也

 $sql = "SELECT name FROM visitors WHERE barcode = '".$barcode."' OR extraData = '".$barcode."'";

我需要对extraData做什么,以便检查变量条形码,并获得相应的名称,姓氏等?

1 个答案:

答案 0 :(得分:3)

SELECT TRIM(BOTH '"' FROM SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(V.extraData,'"name":', -1),',',1),'}',1) 
 FROM visitors V
 WHERE  V.extraData LIKE '%"barcode"%'
   AND :barcode = TRIM(BOTH '"' FROM SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(V.extraData,'"barcode":', -1),',',1),'}',1);

LIKE'%“条形码”%'使用包含条形码值的字段extraData过滤行 :条形码表示要匹配的值,TRIM是为了摆脱额外的双引号,嵌套的SUBSTRING_INDEX搜索:

  

从“条形码”第一场比赛结束时开始的文字:'最多   下一个匹配','(如果有更多的键/值)直到下一个   匹配'}'(如果它是该级别的最后一个键/值)

  1. 请记住,如果您发现某个键/ val始终存在于每一行并且在任何地方都可以访问,那么您应该考虑在表/数据模型中添加一个额外的字段并从中创建一个索引(即姓名,姓氏。

  2. 检索到的值必须“始终”解码。

    "Einstürzende Neubauten" is stored as "Einst\u00fcrzende Neubauten"
    
  3. 进行搜索并比较数字是“ok”,就像在示例中一样(修剪双引号有时不是必要的,就好像你json_encode一个整数var它将被存储为“数字”:99)。但是将根据区域“1,5”/“1.5”

  4. 存储小数
  5. 搜索和比较字符串更棘手:你必须“jsonencode”值才能匹配

    "https://www.google.com" is stored as "https:\/\/www.google.com"
    
  6. 检查data normalization技能。

  7. 检查optimization技能

  8. 使用an online tool查看您的数据将如何编码