Можно ли создать столбец PERSISTED, который состоит из массива указанных значений c JSON, и если да, то как? - PullRequest
0 голосов
/ 22 января 2020

Можно ли создать столбец PERSISTED, который состоит из массива указанных c JSON значений, и если да, то как?

Простой пример (json столбец с именем data):

{ name: "Jerry", age: 91, mother: "Janet", father: "Eustace" }

Постоянный столбец с надеждой (при условии, что json столбец называется «данными»):

ALTER TABLE tablename ADD parents [ data::$mother, data::$father ] AS PERSISTED JSON;

Ожидаемый результат

| data (json)                                                    | parents (persisted json) |
| -------------------------------------------------------------- | ------------------------- |
| { name: "Jerry", age: 91, mother: "Janet", father: "Eustace" } | [ "Janet", "Eustace" ]    |
| { name: "Eustace", age: 106, mother: "Jane" }                  | [ "Jane" ]                |
| { name: "Jim", age: 54, mother: "Rachael", father: "Dom" }     | [ "Rachael", "Dom ]       |
| -------------------------------------------------------------- | ------------------------- |

Выше не работать, но, надеюсь, это передает то, что я пытаюсь сделать sh.

Ответы [ 3 ]

0 голосов
/ 24 января 2020

Хотя это и не ваш вопрос, денормализация этой таблицы в две таблицы может быть хорошим выбором:

create table parents (
  id int primary key auto_increment,
  tablenameid int not null,
  name varchar(20),
  type int not null, -- 1=Father, 2=Mother, ideally foreign key to other table
);
0 голосов
/ 24 января 2020

Вот пример определения таблицы, где я делаю нечто подобное с клиентом и событием:

CREATE TABLE `eventsext2` (
  `data` JSON COLLATE utf8_bin DEFAULT NULL,
  `memsql_insert_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `customer` as data::$custID PERSISTED text CHARACTER SET utf8 COLLATE utf8_general_ci,
  `event` as data::$event PERSISTED text CHARACTER SET utf8 COLLATE utf8_general_ci,
customerevent as concat(data::$custID,", ",data::$event) persisted text,
  `generator` as data::$genID PERSISTED text CHARACTER SET utf8 COLLATE utf8_general_ci,
  `latitude` as (substr(data::$longlat from (instr(data::$longlat,'|')+1))) PERSISTED decimal(21,18),
  `longitude` as (substr(data::$longlat from 1 for (instr(data::$longlat,'|')-1))) PERSISTED decimal(21,18),
  `location` as concat('POINT(',latitude,' ',longitude,')') PERSISTED geographypoint,
  KEY `memsql_insert_time` (`memsql_insert_time`)
  /*!90618 , SHARD KEY () */ 
) /*!90623 AUTOSTATS_CARDINALITY_MODE=OFF, AUTOSTATS_HISTOGRAM_MODE=OFF */ /*!90623 SQL_MODE='STRICT_ALL_TABLES' */;
0 голосов
/ 24 января 2020

Не существует типа данных PERSISTED ARRAY для столбцов, но существует тип столбца JSON, который может хранить массивы.

Например:

-- The existing table
create table tablename (
  id int primary key AUTO_INCREMENT
);

-- Add the new JSON column
ALTER TABLE tablename ADD column parents JSON;

-- Insert data into the table
INSERT INTO tablename (parents) VALUES
    ('[ "Janet", "Eustace" ]'),
    ('[ "Jane" ]');

-- Select table based on matches in the JSON column
select *
from tablename
where JSON_ARRAY_CONTAINS_STRING(parents, 'Jane');

-- Change data in the JSON column
update tablename
set parents = JSON_ARRAY_PUSH_STRING(parents, 'Jon')
where JSON_ARRAY_CONTAINS_STRING(parents, 'Jane')

-- Show changed data
select *
from tablename
where JSON_ARRAY_CONTAINS_STRING(parents, 'Jane');

Ознакомьтесь с другими примерами нажатия и выбора данных JSON в документах по адресу https://docs.memsql.com/v7.0/concepts/json-guide/

...