MYSql
서버 8.0.17을 사용하고 있습니다.
uId = 'UR000001' 및 보안 열 (표에 표시됨)에서 VIEW = 'Y' 로 레코드를 얻고 싶습니다 .
Viewid Security
VW0000000002 {"security": [{"uId": "UR000001", "edit": "N", "view": "Y"}, {"uId": "UR000002", "edit": "N", "view": "Y"}]}
VW0000000013 {"security": [{"uId": "UR000001", "edit": "N", "view": "N"}, {"uId": "UR000002", "edit": "N", "view": "Y"}]}
VW0000000014 {"security": [{"uId": "UR000001", "edit": "N", "view": "Y"}, {"uId": "UR000002", "edit": "N", "view": "Y"}]}
JSON_SEARCH
함수는 내가 원하지 않는 레코드의 모든 배열 요소를 검색합니다.
다음은 내가 시도한 쿼리이지만 모든 일치하는 결과를 반환합니다 ( uID='UR000001'
OR View='Y'
)
SELECT viewid,
Json_search(`security`, 'one', 'UR000001', NULL, '$.security[*].uId'),
Json_search(`security`, 'one', 'Y', NULL, '$.security[*].view')
FROM vw_viewmaster
WHERE Json_search(`security`, 'one', 'UR000001', NULL, '$.security[*].uId')
AND Json_search(`security`, 'one', 'Y', NULL, '$.security[*].view');
실제 결과 :( uID='UR000001'
OR View='Y'
)
VW0000000002 "$.security[0].uId" "$.security[0].view"
VW0000000013 "$.security[0].uId" "$.security[1].view"
VW0000000014 "$.security[0].uId" "$.security[0].view"
예상 결과 :( uID='UR000001'
AND View='Y'
)
VW0000000002 "$.security[0].uId" "$.security[0].view"
VW0000000014 "$.security[0].uId" "$.security[0].view"
MySQL 8.0에서는 편리한 JSON 함수json_table()
를 사용 하여 json 배열을 행으로 변환 할 수 있습니다 . 그런 다음 결과 집합을 검색 할 수 있습니다.
다음 쿼리는 당신에게 모든주는 viewid
그의 적어도 하나의 배열 요소 속성의 uId
동일 'UR000001'
및 속성 view
입니다 'Y'
:
select v.viewid
from vw_viewmaster v
where exists (
select 1
from json_table(
v.security -> '$.security',
'$[*]'
columns(
uid varchar(50) path '$.uId',
edit varchar(1) path '$.edit',
view varchar(1) path '$.view'
)
) x
where x.uid = 'UR000001' and x.view = 'Y'
);
데이터 세트의 경우 다음을 생성합니다 .
| viewid |
| ------------ |
| VW0000000002 |
| VW0000000014 |
일치하는 배열 객체의 세부 정보를 원하면 다음을 수행하십시오.
select v.viewid, x.*
from vw_viewmaster v
cross join json_table(
v.security -> '$.security',
'$[*]'
columns(
rowid for ordinality,
uid varchar(50) path '$.uId',
edit varchar(1) path '$.edit',
view varchar(1) path '$.view'
)
) x
where x.uid = 'UR000001' and x.view = 'Y'
보너스로 rowid
JSON 배열에서 일치하는 개체의 인덱스를 제공합니다 (첫 번째 개체에는 인덱스 1이 있음).
결과 :
| viewid | rowid | uid | edit | view |
| ------------ | ----- | -------- | ---- | ---- |
| VW0000000002 | 1 | UR000001 | N | Y |
| VW0000000014 | 1 | UR000001 | N | Y |
그러나 조건을 충족하는 배열의 개체가 둘 이상인 경우 위 쿼리는 원래 테이블의 행당 둘 이상의 행을 생성합니다 (이것이 내가 exists
첫 번째 쿼리에서 사용한 이유입니다 ).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다