2017-02-16 23 views
0

我有一個名爲BLOBFIELD的blob字段表。JSON_VALUE(BLOB FIELD)中的ORACLE -LIKE條件不起作用?

這樣的:當我用等號

SELECT A.ID 
FROM A AP 
WHERE JSON_VALUE(
     AP.BLOBFIELD format json, 
     '$.arrays.AAA.arrays.BBB.fields.Name' 
     ) = 'peter' 

工作正常。但這:

SELECT A.ID 
FROM A AP 
WHERE JSON_VALUE(
     AP.BLOBFIELD format json, 
     '$.arrays.AAA.arrays.BBB.fields.Name' 
     ) LIKE 'peter%' 

和:

SELECT A.ID 
FROM A AP 
WHERE (JSON_VALUE(
     AP.BLOBFIELD format json, 
     '$.arrays.AAA.arrays.BBB.fields.Name' 
     )) LIKE '%peter%' 

我不有錯誤,但我認爲它不工作,因爲AAA和BBB是數組
我發現regex_like但這個函數接收諸如首先值一個字段,但我沒有字段我有一個json路徑。

SELECT A.ID FROM A AP 
WHERE JSON_VALUE(AP.BLOBFIELD format json, '$.arrays.AAA[*].arrays.BBB[*].fields.Name' ERROR ON ERROR) LIKE 'peter%' 

不工作。我怎樣才能使用LIKE來工作?

+1

通過「不工作」待見,你的意思,你得到一個錯誤,或者只是沒有返回結果? – IMSoP

+0

沒有結果返回 –

+0

此鏈接http://stackoverflow.com/a/16301995/3377472顯示了一個例子。 –

回答

0

我使用LIKE運行JSON_VALUE,它的工作完美。我在12.1.0.2 RELEASE和更高版本上測試過。 如果您在JSON_VALUE中使用ERROR ON ERROR子句,會發生什麼情況?

SELECT A.ID 從AP WHERE JSON_VALUE( AP.BLOBFIELD格式JSON, '$ .arrays.AAA.arrays.BBB.fields.Name' ERROR ON ERROR )LIKE '%彼得'

您是否看到錯誤?

+0

我沒有錯誤,但我認爲它不起作用,因爲AAA和BBB是數組示例。 SELECT A.ID FROM AP WHERE JSON_VALUE(AP.BLOBFIELD format json,'$ .arrays.AAA [*]。arrays.BBB [*]。fields.Name'ERROR ON ERROR)LIKE'peter%' –

1

JSON_VALUE不能用於訪問文檔中多次出現的密鑰。例如,如果鍵或其父項是數組,則不能通過JSON_VALUE訪問內容,除非JSON_PATH表達式使用索引來標識數組的特定成員。

我們需要使用JSON_TABLE來解決這一個...

SQL> WITH A as 
    2 ( select 1 ID, 
    3   '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Max"}}},{"BBB":{"fields":{"Name":"Mike"}}}]}},{"AA 
A":{"arrays":[{"BBB":{"fields":{"Name":"Mark"}}},{"BBB":{"fields":{"Name":"Matt"}}}]}}]}' BLOBFIELD 
    4  from DUAL 
    5  union all 
    6  select 2 ID, 
    7   '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Pat"}}},{"BBB":{"fields":{"Name":"Pete"}}}]}},{"AA 
A":{"arrays":[{"BBB":{"fields":{"Name":"Paul"}}},{"BBB":{"fields":{"Name":"Pascal"}}}]}}]}' BLOBFIELD 
    8  from DUAL 
    9 ) 
10 SELECT distinct AP.ID 
11 FROM A AP, 
12   JSON_TABLE(
13   AP.BLOBFIELD, 
14   '$.arrays[*]' 
15   COLUMNS 
16   NESTED PATH 
17   '$.AAA.arrays[*]' 
18   COLUMNS (
19    NAME VARCHAR2(32) PATH '$.BBB.fields.Name' 
20   ) 
21  ) 
22 where NAME LIKE '%Pete%' 
23 
SQL>  /
     2 

只是爲了保持完整性。

您沒有JSON_VALUE行的原因是默認的「NULL ON ERROR」行爲。這可以通過添加錯誤或錯誤條款可以看出以下

SQL> WITH A as 
    2 ( select 1 ID, 
    3   '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Max"}}},{"BBB":{"fields":{"Name":"Mike"}}}]}},{"AA 
A":{"arrays":[{"BBB":{"fields":{"Name":"Mark"}}},{"BBB":{"fields":{"Name":"Matt"}}}]}}]}' BLOBFIELD 
    4  from DUAL 
    5  union all 
    6  select 2 ID, 
    7   '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Pat"}}},{"BBB":{"fields":{"Name":"Pete"}}}]}},{"AA 
A":{"arrays":[{"BBB":{"fields":{"Name":"Paul"}}},{"BBB":{"fields":{"Name":"Pascal"}}}]}}]}' BLOBFIELD 
    8  from DUAL 
    9 ) 
10 SELECT AP.ID 
11 FROM A AP 
12 WHERE JSON_VALUE(
13   AP.BLOBFIELD format json, 
14   '$.arrays.AAA.arrays.BBB.fields.Name' 
15  ) LIKE 'peter%' 
16/

no rows selected 

SQL> WITH A as 
    2 ( select 1 ID, 
    3   '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Max"}}},{"BBB":{"fields":{"Name":"Mike"}}}]}},{"AA 
A":{"arrays":[{"BBB":{"fields":{"Name":"Mark"}}},{"BBB":{"fields":{"Name":"Matt"}}}]}}]}' BLOBFIELD 
    4  from DUAL 
    5  union all 
    6  select 2 ID, 
    7   '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Pat"}}},{"BBB":{"fields":{"Name":"Pete"}}}]}},{"AA 
A":{"arrays":[{"BBB":{"fields":{"Name":"Paul"}}},{"BBB":{"fields":{"Name":"Pascal"}}}]}}]}' BLOBFIELD 
    8  from DUAL 
    9 ) 
10 SELECT AP.ID 
11 FROM A AP 
12 WHERE JSON_VALUE(
13   AP.BLOBFIELD format json, 
14   '$.arrays.AAA.arrays.BBB.fields.Name' 
15   ERROR ON ERROR 
16  ) LIKE 'peter%' 
17/
FROM A AP 
     * 
ERROR at line 11: 
ORA-40470: JSON_VALUE evaluated to multiple values 


SQL>