簡體   English   中英

SQL-存儲在JSON varchar中的SELECT WHERE日期大於或小於固定日期

[英]SQL - SELECT WHERE date stored in a JSON varchar is greater or less than a fixed date

我有一個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 ...

=> DT:2019-03-18

我仍然無法測試該值。

出於性能原因,應在插入時將數據提取到單獨的列中。 您想要做的方式非常慢。

但是,如果必須這樣做,請檢查以下內容: 如何在MySQL中編寫可解析列中JSON數據的查詢?

它顯示了如何直接處理數據,而不是使用正則表達式。 AFAIK適用於MySQL / Postgres,大多數RDBMS具有JSON功能,但我認為它不是非常標准化的,因此請查看適當的dox。

我認為您JSON_EXTRACT(column,'$[41].v') ,請查看https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html以獲取更多信息。

REGEXP_SUBSTRHAVING的解決方案:

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 <> ""

它運作良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM