SQL 一行拆分成多行

SQL 語言是訪問和處理關係型數據的一種標準語言,SQL 一行拆分成多行常見於一些需要用到多行的sql查詢。

一、將一行數據轉換成多行

在實際的業務中,往往會遇到需要將數據進行拆分成多行的情況。例如,一條記錄包括多個聯繫人,需要將聯繫人從一行數據拆分成多行。這時候我們可以使用 CROSS APPLY 函數,將文本字元串轉換成行集合。

SELECT * 
FROM   (
           SELECT 'John,Male,30' AS Info 
           UNION ALL 
           SELECT 'Kelly,Female,25' AS Info 
           UNION ALL 
           SELECT 'James,Male,35' AS Info 
       ) T 
       CROSS APPLY
       (
           SELECT f.item  
           FROM STRING_SPLIT(t.info, ',') AS f
       ) x 

在上述代碼中,CROSS APPLY 函數根據逗號分割將文本串進行轉換,變成多行數據。

二、 SQL 拆分多行

此時我們再看一個反向的操作,即將多行數據拆分成單行字元串。在實際業務中,往往會存在一些需要將多行數據轉化為字元串的需求,例如生成數據的報表。為此,我們可以使用 STUFFFOR XML PATH函數來完成這個過程。

DECLARE @Data TABLE
(
   Id    INT,
   Name  VARCHAR(50),
   Phone VARCHAR(50)
);

INSERT INTO @Data
VALUES (1, 'John', '111-111-1111'),
       (2, 'Frank', '222-222-2222'),
       (3, 'Kelly', '333-333-3333');

SELECT Id, 
       STUFF((SELECT '; ' + Phone 
              FROM   @Data 
              WHERE  Id = d.Id 
              FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS Phones
FROM   @Data AS d;

在上述代碼中,STUFF 函數將多行數據拼接成一行字元串,而 FOR XML PATH 元素將每個值轉化為XML元素。

三、 SQL 多行合併成一行

反之,我們也可以將多行數據合併成單行字元串,這時候就需要用到 GROUP_CONCAT 函數。

SELECT NAME, 
GROUP_CONCAT(DISTINCT Phone 
ORDER BY Phone DESC 
SEPARATOR '|') AS Phonelist
FROM   @Data 
GROUP  BY Name;

在上述代碼中,GROUP_CONCAT 函數將所有數據行合併成單行,分隔符為 |

四、SQL 逗號分割轉成多行

在實際業務中,常常會遇到一些需要將逗號分隔字元串轉換成多行數據的需求。這時候,我們可以使用 STRING_SPLIT 函數來完成這個操作:

SELECT value 
FROM   STRING_SPLIT('John,Kelly,James', ',')

這段代碼可以將以逗號分隔的字元串拆分成多行。

五、SQL 一行拆分成多行的優化

在實際業務中,為了提高查詢性能,我們通常需要對查詢進行優化。首先需要確保語句的正確性。其次需要根據數據量的大小和查詢頻率來選擇合適的索引。最後,我們可以使用分批處理(分頁)來避免在查詢大量數據時產生內存溢出等問題。

例如,在使用 STUFF 函數進行數據拼接時,如果一次拼接的數據過大,那麼很容易就會出現內存溢出的問題。這時我們可以使用分批處理,每次只處理一定數量的數據,避免內存壓力過大。

DECLARE @Start INT = 1;
DECLARE @End INT = 100;
 
WHILE (@Start <= (SELECT MAX(Id) FROM @Data))
BEGIN
    SELECT Id, STUFF((SELECT ', ' + Phone
                       FROM @Data
                       WHERE Id BETWEEN @Start AND @End
                       FOR XML PATH('')), 1, 1, '') AS Phones
    FROM @Data
    WHERE Id BETWEEN @Start AND @End;
 
    SET @Start = @End + 1;
    SET @End = @End + 100;
END;

在上述代碼中,我們將大量數據分割成若干個小批次,以減少每次查詢的數據量,提高查詢性能。

六、 總結

SQL 一行拆分成多行的應用十分常見,並且在實際業務操作中也十分必要。我們可以通過多種方式來實現這一操作,包括使用 CROSS APPLY 函數、 STUFFFOR XML PATH函數、 GROUP_CONCAT 函數以及 STRING_SPLIT 函數。同時,在查詢性能優化上,需要注意語句的正確性、索引選擇以及分批處理等因素。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/240879.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:23
下一篇 2024-12-12 12:23

相關推薦

  • Hibernate日誌列印sql參數

    本文將從多個方面介紹如何在Hibernate中列印SQL參數。Hibernate作為一種ORM框架,可以通過列印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • 使用SQL實現select 聚合查詢結果前加序號

    select語句是資料庫中最基礎的命令之一,用於從一個或多個表中檢索數據。常見的聚合函數有:count、sum、avg等。有時候我們需要在查詢結果的前面加上序號,可以使用以下兩種方…

    編程 2025-04-29
  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • SQL預研

    SQL預研是指在進行SQL相關操作前,通過數據分析和理解,確定操作的方法和步驟,從而避免不必要的錯誤和問題。以下從多個角度進行詳細闡述。 一、數據分析 數據分析是SQL預研的第一步…

    編程 2025-04-28
  • SQL Server Not In概述

    在今天的軟體開發領域中,資料庫查詢不可或缺。而SQL Server的”Not In”操作符就是這個領域中非常常用的操作符之一。雖然”Not In…

    編程 2025-04-25
  • GORM SQL注入詳解

    GORM是一個非常優秀的Go語言ORM框架,它的目標是簡化資料庫操作,提高開發效率,但是在使用的過程中,也難免會遇到SQL注入的問題。本文將從多個方面來詳細解析GORM SQL注入…

    編程 2025-04-25
  • SQL ROW_NUMBER 函數用法

    一、實現排序 SQL ROW_NUMBER 函數是 SQL Server 資料庫實現分組排序功能的一種方法,允許您根據一個或多個列進行排序。這是 SQL ROW_NUMBER 的一…

    編程 2025-04-25
  • SQL Server時間差詳解

    一、DATEDIFF函數 DATEDIFF函數可用於計算兩個時間之間的差值,其語法如下: DATEDIFF (datepart, startdate, enddate) 其中,da…

    編程 2025-04-25
  • SQL AND OR 優先順序詳解

    一、AND 和 OR 的應用場景 AND 和 OR 作為 SQL 查詢語句中最常用的邏輯運算符,它們可以幫助我們更快、更方便地篩選出相應條件下的數據。AND 主要用於多條件的組合查…

    編程 2025-04-25
  • TrimSql:一個SQL構建器的探究

    一、簡介 TrimSql是一個用於構建SQL語句的Java庫。它具有極高的可讀性和可維護性,同時提供了多種構建SQL語句的方法,包括動態參數、命名參數等。它還支持多種資料庫,並且易…

    編程 2025-04-25

發表回復

登錄後才能評論