1

如果这个问题太菜鸟,我很抱歉。

我有一个存储在列中的 jason 数组,我想知道是否可以读取一个数组并将其排序。

比如说如果这是 , 中的column A数据{'class':'beatiful','name':'wonderful'}。我要排序'class' as ASC

如何实现sql语句?我可以举个例子吗?

或者什么样的数据存储格式可以做这种要求添加新列的请求?

非常感谢你。

4

2 回答 2

1

JSON不使用引号吗?
尝试一些字符串函数来提取它。例如,您可以找到“类”的位置。然后,寻找下一个开头的双引号,这将是值的开始。然后,寻找另一个,这将是价值的结束。最后,取出子串。

伪代码如下所示:
P1 = 类键的位置 = LOCATE('"class"', COL_A)
P2 = 值的打开报价的位置 = LOCATE('"', COL_A, P1 + 7 )
P3 = 关闭的位置值的报价 = LOCATE('"', COL_A, P2 + 1)
即值的子串 = SUBSTRING(COL_A, P2, P3 - P2)

扩展:
SUBSTRING(COL_A, LOCATE('"', COL_A, LOCATE('"class"', COL_A)+ 7 ), LOCATE('"', COL_A, LOCATE('"', COL_A, P1 + 7 ) + 1) - 定位('"', COL_A, LOCATE('"class"', COL_A) + 7 ))

我没有在 MySql 上运行它来检查,但你明白了。此外,您可能想要更改它,以便您可以处理字符串“class”出现在其他值字段中的情况。

一旦你有了一个提取值的表达式,你就可以对其进行排序。

于 2013-02-07T21:34:44.697 回答
1

这并不漂亮,但这基本上是拆分您的 JSON 字符串并按类排序:

select *
  , substring_index(substring_index(
      replace(substr(A, 2, char_length(A) - 2), '\':\'', '\',\'')
      , ','
      , find_in_set('\'class\'', replace(substr(A, 2, char_length(A) - 2), '\':\'', '\',\'')) + 1
    ), ',', -1) as SortItem
from MyTable
order by SortItem;

这是一个演示 SqlFiddle

您可能必须根据 JSON 中的引号或撇号更改分隔符。

此外,正如评论所指出的,这很丑陋,因为您以非关系方式使用关系数据库。

于 2013-02-07T21:54:09.720 回答