假設我有一個名為的表agents_timesheet,其結構如下:
ID | name | health_check_record | date | clock_in | clock_out
---------------------------------------------------------------------------------------------------------
1 | AAA | {"mental":{"stress":"no", "depression":"no"}, | 6-Dec-2021 | 08:25:07 |
| | "physical":{"other_symptoms":"headache", "flu":"no"}} | | |
---------------------------------------------------------------------------------------------------------
2 | BBB | {"mental":{"stress":"no", "depression":"no"}, | 6-Dec-2021 | 08:26:12 |
| | "physical":{"other_symptoms":"no", "flu":"yes"}} | | |
---------------------------------------------------------------------------------------------------------
3 | CCC | {"mental":{"stress":"no", "depression":"severe"}, | 6-Dec-2021 | 08:27:12 |
| | "physical":{"other_symptoms":"cancer", "flu":"yes"}} | | |
現在我需要讓所有感染流感的代理人都在當天。至于flu從 Oracle SQL 中的單個 JSON 獲取,我已經可以通過以下 SQL 陳述句獲取它:
SELECT * FROM JSON_TABLE(
'{"mental":{"stress":"no", "depression":"no"}, "physical":{"fever":"no", "flu":"yes"}}', '$'
COLUMNS (fever VARCHAR(2) PATH '$.physical.flu')
);
至于從列中獲取值health_check_record,我可以通過使用SELECT陳述句來獲取它。
但是如何獲取該表flu的 JSON 中的值health_check_record?
補充問題
根據該表,我如何檢索 的完整串列other_symptoms,然后它會給我這樣的輸出:
ID | name | other_symptoms
-------------------------------
1 | AAA | headache
2 | BBB | no
3 | CCC | cancer
uj5u.com熱心網友回復:
您可以使用 JSON_EXISTS() 函式。
SELECT *
FROM agents_timesheet
WHERE JSON_EXISTS(health_check_record, '$.physical.flu == "yes"');
還有一種“普通的老方法”,無需 JSON 決議只像標準 VARCHAR 那樣的列。這種方式在 100% 的情況下不起作用,但如果您以與您描述的相同的方式獲取資料,則可能就足夠了。
SELECT *
FROM agents_timesheet
WHERE health_check_record LIKE '%"flu":"yes"%';
uj5u.com熱心網友回復:
如何在該表的health_check_record 中的JSON 中獲取flu 的值?
從 Oracle 12 開始,要獲取可以JSON_TABLE與CROSS JOIN表相關聯的值:
SELECT a.id,
a.name,
j.*,
a."DATE",
a.clock_in,
a.clock_out
FROM agents_timesheet a
CROSS JOIN JSON_TABLE(
a.health_check_record,
'$'
COLUMNS (
mental_stress VARCHAR2(3) PATH '$.mental.stress',
mental_depression VARCHAR2(3) PATH '$.mental.depression',
physical_fever VARCHAR2(3) PATH '$.physical.fever',
physical_flu VARCHAR2(3) PATH '$.physical.flu'
)
) j
WHERE physical_flu = 'yes';
db<>在這里擺弄
uj5u.com熱心網友回復:
您可以使用“點表示法”從 JSON 列訪問資料。像這樣:
select "DATE", id, name
from agents_timesheet t
where t.health_check_record.physical.flu = 'yes'
;
DATE ID NAME
----------- --- ----
06-DEC-2021 2 BBB
請注意,此方法要求您使用表名的別名(以便您可以在訪問 JSON 資料時使用它)。
為了測驗,我使用了 MT0 在 dbfiddle 上發布的資料。我不是雙引號列名的忠實粉絲;使用其他東西 for "DATE",例如dt或date_。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/376677.html
