我在表中有資料:
| ID | 問題 |
|---|---|
| 1 | 1.1 Covid-19 [案例] |
| 2 | 1.1 Covid-19 [死亡] |
我想將資料拆分為列。要獲得以下輸出:
| ID | 問題ID | 問題名稱 | 子問題名稱 |
|---|---|---|---|
| 1 | 1.1 | 新冠肺炎 | 案例 |
| 2 | 1.1 | 新冠肺炎 | 死亡人數 |
是否有任何功能可以獲得高于輸出。?
uj5u.com熱心網友回復:
這樣做的一種方法是使用非常有用的 PostgreSQLSPLIT_PART函式,它允許您拆分字符(在您的特定情況下,空格)。只要最后一個欄位不需要括號,您可以在左括號上拆分并使用該RTRIM函式洗掉最后一個括號。
SELECT id,
SPLIT_PART(question, ' ', 1) AS questionid,
SPLIT_PART(question, ' ', 2) AS question_name,
RTRIM(SPLIT_PART(question, '[', 2), ']') AS sub_question_name
FROM tab
在此處查看演示。
您可以在 PostgreSQL官方檔案中與字串函式相關的檔案中加深對這些函式的理解。
編輯:對于更高級的匹配,您應該考慮使用正則運算式和 PostgreSQL模式匹配:
SELECT id,
(REGEXP_MATCHES(question, '^[\d\.] '))[1] AS questionid,
(REGEXP_MATCHES(question, '(?<= )[^[] '))[1] AS question_name,
(REGEXP_MATCHES(question, '(?<=\[).*(?=\]$)'))[1] AS sub_question_name
FROM tab
正則運算式questionid解釋:
^: 字串的開始[\d\.]:數字和點的任何現有組合
正則運算式question_name解釋:
(?<= ): 匹配匹配前的空格的正向lookbehind[^[]: 任何字符的任何現有組合,除了[
正則運算式sub_question_name解釋:
(?<=\[): 正向向后看,匹配匹配前的左括號.*: 任意字符(?=\]$): 匹配后匹配封閉括號的正向前瞻
在此處查看演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485666.html
標籤:sql 正则表达式 PostgreSQL 分裂
