SQL - ВЫБЕРИТЕ, ГДЕ дата, хранящаяся в JSON varchar, больше или меньше фиксированной даты - PullRequest
0 голосов
/ 18 марта 2019

У меня есть столбец VARCHAR, в котором пользователь сохраняет пользовательские данные из даты ввода, выбора, флажка и типа ввода.

[{"i":24,"v":[0,1,4]},{"i":26,"v":[2,3,6,10]},{"i":41,"v":"2019-03-18"},{"i":27,"v":[26]},{"i":6,"v":"Very happy to be here."},{"i":13,"v":4},{"i":22,"v":9},{"i":3,"v":"Numerous"},{"i":4,"v":3},{"i":29,"v":[2,3]},{"i":30,"v":[3,4]}]

Я знаю, что ID 41 - это дата. Я хочу ВЫБРАТЬ этого пользователя, если существует ID 41 и если данные больше фиксированной даты.

Моя идея состоит в том, чтобы использовать REGEXP, чтобы проверить, существует ли ID 41: REGEXP \'(\{"i":41,), а затем перехватить дату и проверить ее (TO_DATE?). Как я могу сделать эту вторую часть?

Изменить - Я нашел решение, чтобы поймать дату с REGEXP_SUBSTR:

SELECT user_id, REGEXP_SUBSTR(my_json_col, \'(?<=\{"i":41,"v":")(.*?)(?="\})\') AS dt FROM ...

=> ДТ: 2019-03-18

Я все еще не могу проверить значение.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Вы должны извлекать данные в отдельные столбцы во время вставки из соображений производительности.Вы хотите сделать это ОЧЕНЬ медленно.

Однако, если вы ДОЛЖНЫ сделать это таким образом, проверьте это: Как можно писать запросы в MySQL, которые могут анализировать данные JSON в столбце?

Показывает, как обращаться к данным напрямую, а не с помощью регулярных выражений.AFAIK это работает для MySQL / Postgres, большинство СУБД имеют возможности JSON, но я не думаю, что это очень стандартизировано, поэтому проверьте соответствующий dox.1010 *https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html для большего понимания.

0 голосов
/ 21 марта 2019

Решение с REGEXP_SUBSTR и HAVING :

SELECT
    user_id,
    REGEXP_SUBSTR(my_json_col, \'(?<=\{"i":41,"v":")(.*?)(?="\})\') AS dt
FROM mytable
HAVING
    DATE(dt) < DATE(NOW())
    and DATE(dt) > DATE("2019-03-15")
    and dt <> ""

Работает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...