我有一張桌子有以下幾行
| 姓名 | 電話 | 培訓班 |
|---|---|---|
| 美國廣播公司 | 123, 456 | HTML、Java |
| XYZ | 321, 654 | PHP, CSS |
現在我想撰寫一個 SELECT 查詢來將這些逗號分隔的電話和課程作為單獨的行。通過使用這個 SELECT 查詢,我產生了直到 Phone 列的結果,但停留在第二列。選擇查詢是
SELECT
Name,
value phone,
courses
FROM
tblName
CROSS APPLY STRING_SPLIT(phones, ',');
此查詢向我顯示以下結果:
| 姓名 | 電話 | 培訓班 |
|---|---|---|
| 美國廣播公司 | 123 | HTML、Java |
| 美國廣播公司 | 456 | HTML、Java |
| XYZ | 321 | PHP, CSS |
| XYZ | 654 | PHP, CSS |
請幫助我將 Courses 列拆分為 Phones 并希望產生以下結果:
| 姓名 | 電話 | 培訓班 |
|---|---|---|
| 美國廣播公司 | 123 | HTML |
| 美國廣播公司 | 456 | HTML |
| 美國廣播公司 | 123 | 爪哇 |
| 美國廣播公司 | 456 | 爪哇 |
| XYZ | 321 | PHP |
| XYZ | 654 | PHP |
| XYZ | 321 | CSS |
| XYZ | 654 | CSS |
uj5u.com熱心網友回復:
因為 - 根據您的描述 - 您使用CROSS APPLY并且您的查詢已成功執行,這意味著您使用的是 SQL Server DB,而不是 MY SQL。你可以做兩個CROSS APPLY來得到你預期的結果。這將產生您在問題中顯示的結果:
SELECT name, phone, value courses FROM
(SELECT name, value phone, courses
FROM tblName CROSS APPLY STRING_SPLIT(phones, ',')) x
CROSS APPLY STRING_SPLIT(courses, ',')
ORDER BY name, courses, phone;
你可以在這里驗證這一點:db<>fiddle
但這是非常危險的,你真的應該避免在一列中使用這種逗號分隔的內容。我強烈建議將來為不同的值創建單獨的列。
uj5u.com熱心網友回復:
好吧,我自己找到了解決方案。這是作業查詢:
SELECT
t1.name,
t1.phone,
value course
FROM
(SELECT
first_name,
value phone,
courses
FROM
tblName
CROSS APPLY STRING_SPLIT(phones, ',')) t1
CROSS APPLY STRING_SPLIT(t1.courses, ',');
感謝大家。
uj5u.com熱心網友回復:
在MySQL沒有CROSS APPLY,就MySQL 8 可以使用橫向連接。首先,我們需要一個表格,其中包含的數字至少與我們最長的逗號分隔串列的長度一樣大。
create temporary table numbers as (
select 1 as n
union select 2 as n
union select 3 as n
union select 4 as n
union select 5 as n
union select 6 as n
union select 7 as n
union select 8 as n
);
然后使用:
select
Name,
substring_index( substring_index(Phones, ',', n),',', -1) as Phones,
substring_index( substring_index(Courses, ',', n),',', -1) as Courses
from tbl
join numbers
on char_length(Phones)
- char_length(replace(Phones, ',', ''))
>= n - 1
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5dbf18633f9d99c725d7dbb928c3c478
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/483411.html
