我有一個 JSON 列,我正在嘗試使用該CONTAINS函式在該列上進行搜索。
表格1
| JSON_COL |
|---|
{"MarketInfo":"ABCDEFGHE"{"data" : "ABC" "OriginalData": "I"}} |
Select *
from table1
where CONTAINS(JSON_COL, "I INPATH('/MarketInfo/ABCDEFGHE/OriginalData)')>0)
沒有結果
| JSON_COL |
|---|
{"MarketInfo": "ABCDEFGHE"{"data" : "ABC" "OriginalData": "II"}} |
Select *
from table1
where CONTAINS(JSON_COL, "II INPATH('/MarketInfo/ABCDEFGHE/OriginalData)')>0)
給我正確的結果。
我檢查過json_textcontains,json_value這些功能也有相同的。搜索時結果是正確的,II但是當我搜索時I不顯示結果。你能告訴我這里有什么問題嗎?
uj5u.com熱心網友回復:
CONTAINS處理 XML 資料;不是 JSON 資料。
我檢查過
json_textcontains,json_value這些功能也有相同的。
似乎有一些奇怪的東西(可能是一個錯誤,可能是轉換為不同的資料型別):
CREATE TABLE table1 (
JSON_COL CLOB CHECK (json_col IS JSON)
);
CREATE INDEX json_index
ON table1(json_col)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('SECTION GROUP CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)')
INSERT INTO table1 (JSON_COL)
SELECT '{"MarketInfo": {"ABCDEFGHE": {"data": "ABC", "OriginalData": "X"}}}' FROM DUAL UNION ALL
SELECT '{"MarketInfo": {"ABCDEFGHE": {"data": "ABC", "OriginalData": "I"}}}' FROM DUAL UNION ALL
SELECT '{"MarketInfo": {"ABCDEFGHE": {"data": "ABC", "OriginalData": "II"}}}' FROM DUAL;
COMMIT;
那么如果你這樣做:
SELECT json_col
FROM table1
WHERE JSON_TEXTCONTAINS(json_col, '$.MarketInfo.ABCDEFGHE.OriginalData', 'I')
要么
SELECT json_col
FROM table1
WHERE JSON_VALUE(json_col, '$.MarketInfo.ABCDEFGHE.OriginalData') = 'I'
要么
SELECT json_col
FROM table1
CROSS APPLY JSON_TABLE(
json_col,
'$.MarketInfo.ABCDEFGHE'
COLUMNS (
OriginalData VARCHAR2(20) PATH '$.OriginalData'
)
)
WHERE OriginalData = 'I'
然后不輸出任何行。但是替換II或X代替I它們都回傳匹配的行。
VARCHAR2您可以通過顯式轉換為資料型別來獲得正確的結果:
SELECT json_col
FROM table1
WHERE CAST(JSON_VALUE(json_col, '$.MarketInfo.ABCDEFGHE.OriginalData') AS VARCHAR2(20)) = 'I'
要么
SELECT json_col
FROM table1
CROSS APPLY JSON_TABLE(
json_col,
'$.MarketInfo.ABCDEFGHE'
COLUMNS (
OriginalData VARCHAR2(20) PATH '$.OriginalData'
)
)
WHERE CAST(OriginalData AS VARCHAR2(20)) = 'I'
兩者都輸出:
JSON_COL {"MarketInfo": {"ABCDEFGHE": {"data": "ABC", "OriginalData": "I"}}}
But there is no obvious reason why this would be required.
db<>fiddle here
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442073.html
上一篇:從子表中獲取所有1:n記錄
