![](/img/trans.png)
[英]Is there any way to use values from a JSON object in a SQL Select statement?
[英]Is there any way to use json objects in SQL
這是問題所在:
我們有一個MySQL數據庫,我們在其中存儲JSON字符串。 到目前為止,這沒有問題,但突然我們的客戶要求我們使用這些對象進行搜索/訂購/其他操作。 由於項目處於相當晚的狀態,所以前往Mongo不是團隊領導者想要做出的選擇,所以我想問有沒有快速的方法來使用這些JSON字符串?
意圖是JSON
在MySQL中無法使用JSON。 有些DBMS可能支持JSON,但這是不可能的,此外,任何類型的“支持”只是執行一些特定於JSON的操作,而不是關於建模您的架構(這兩件事情完全不同)更多,完全意義上,MySQL的模型概念(即關系)與JSON不同的是:作為關系型DBMS,它遵循關系數據模型 ,而JSON是完全不同的格式。 您將它存儲為純字符串值,因此,如果不使用字符串函數,則無法以其他方式對其執行任何操作。 因此,即使使用JSON,您也不會在關系模型中執行此操作,因此,不可能維護關系功能,例如參照完整性。
要解決的選項
你有幾個選擇:
CREATE FUNCTION
語句)執行此操作。 當然,這需要特定的技能和時間。 壞事:錯誤。 即使您能夠比重新構建體系結構或遷移到Mongo更快地創建這些功能,您仍然無法確定這些功能的質量。 沒有辦法本機測試該代碼。 但是,我可能會提示用戶登陸功能的情況 - 你可以使用mysql-unit
來測試你存儲的代碼,如果你的MySQL是5.6或更高(嗯,我寫過這個工具,但是......它可能包含蟲子也) “標准”功能
最后,如果您正在運行MySQL 5.7,那么預發布JSON函數可能會有一線希望 - 因此,您可以嘗試使用當前為MySQL 5.7存在的alfa版本的JSON功能。 但我不會(強烈)建議在實際項目中使用它,因為這些功能既沒有經過充分測試也沒有完整。 但是,要安裝這些功能,您需要下載相應的軟件包,然后將它們插入您的服務器,如:
CREATE FUNCTION json_append RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_valid RETURNS integer SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_extract RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_replace RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_remove RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_set RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_merge RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_search RETURNS string SONAME 'libmy_json_udf.so';
CREATE FUNCTION json_contains_key RETURNS integer SONAME 'libmy_json_udf.so';
之后你就可以嘗試了。
如果您沒有使用任何MySQL特定功能,您可以相對輕松地切換到PostgreSQL,並利用其JSONB數據類型。
如果你看一下關於它包含在PostgreSQL 9.4中的官方維基頁面 ,那么你會看到,通過這個,你可以存儲原始的JSON並對它進行查詢。 作為一個例子,給定這個JSON結構(我用標准類型替換了PostgreSQL特定的列類型,但JSONB類型除外:
table booksdata (
title text not null,
isbn text not null primary key,
pubinfo jsonb not null
)
然后,您可以查詢它以查找來自單個發布商的所有圖書的平均費用,如下所示:
SELECT avg((pubinfo #>> '{"cost"}')::NUMERIC)
FROM booksdata
WHERE pubinfo @> '{ "publisher" : "It Books" }';
MySQL5.7現在支持JSON數據類型 - https://dev.mysql.com/doc/refman/5.7/en/json.html
似乎他們不想被排除在NoSQL對話之外。
mysql> SELECT JSON_ARRAY('a', 1, NOW());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.