Home [MySql][SP] 傳入參數值使用 json array 方式帶入
Post
Cancel

[MySql][SP] 傳入參數值使用 json array 方式帶入

Take notes for me.

測試:使用 JSON_TABLE 將 JSON 陣列轉為表格

1
2
3
4
5
6
7
8
9
10
11
12
SET @J = '[{"A":1,"B":2},{"A":2,"B":3}]';

-- 使用 JSON_TABLE 将 JSON 数组转为表格
SELECT * 
FROM JSON_TABLE(
    @J,                        -- JSON 数据
    '$[*]'                     -- JSON 数组的每个元素路径
    COLUMNS (
        A INT PATH '$.A',      -- 映射 JSON 中的 "A" 键到列 A
        B INT PATH '$.B'       -- 映射 JSON 中的 "B" 键到列 B
    )
) AS jt;                        -- 给表函数一个别名

執行結果:

1
2
3
# A, B
'1', '2'
'2', '3'

SP

1
WHERE id IN (SELECT m.matchId FROM JSON_TABLE(matchIds, '$[*]' COLUMNS (matchId INT PATH '$')) AS m)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE PROCEDURE `json_array_mapping_get`(
	IN matchIds TEXT -- IDs
)
BEGIN
	SELECT 
		m.id,
		l.color,
		l.`type` AS kind,
		m.league_id,
		l.name_en AS league_en,
		m.sub_league_id,
		s.sub_name_en AS sub_league_en,
        m.match_time,
		m.start_time,
		e.explain_en
	FROM
		matches AS m 
			INNER JOIN
		leagues AS l ON m.league_id = l.id # 內連接足球聯賽表,根據聯賽ID匹配,別名為 l
			LEFT JOIN
		sub_leagues AS s ON m.sub_league_id = s.id	# 左連接足球子聯賽表,根據子聯賽ID匹配,若無匹配則返回 NULL,別名為 s
			INNER JOIN
		teams AS h ON m.home_id = h.id # 內連接主隊表,根據主隊ID匹配,別名為 h
			INNER JOIN
		teams AS a ON m.away_id = a.id # 內連接客隊表,根據客隊ID匹配,別名為 a
			LEFT JOIN
		explain AS e ON e.match_id = m.id # 左連接比賽說明表,根據比賽ID匹配,若無匹配則返回 NULL,別名為 e
	WHERE
		#  JSON_ARRAY 中提取所有 matchId,定義 matchId 列,將 JSON 數組中的每個元素映射到整數類型
		m.id IN (SELECT m.matchId FROM JSON_TABLE(matchIds, '$[*]' COLUMNS (matchId INT PATH '$')) AS m);
END

執行方式

1
2
-- [1,2,3,4,5] array 方式傳入
call match_get('[999,888,31530,1520,2519]');
This post is licensed under CC BY 4.0 by the author.