字元串和關係格式的轉化

来源:http://www.cnblogs.com/ljhdo/archive/2017/07/18/4789343.html
-Advertisement-
Play Games

在資料庫開發過程中,字元串和關係表的轉化是一項基本技能。當字元串中存在分隔符時,有時將其轉換成關係表數據,和其他數據表進行join查詢,出現這種情況,是因為沒有遵守關係資料庫的設計範式,沒有把字元串拆分成原子項存儲,也有可能是數據傳參數;有時會遇到相反的情況,需要將關係表的相關數據拼接成一個字元串顯 ...


在資料庫開發過程中,字元串和關係表的轉化是一項基本技能。當字元串中存在分隔符時,有時將其轉換成關係表數據,和其他數據表進行join查詢,出現這種情況,是因為沒有遵守關係資料庫的設計範式,沒有把字元串拆分成原子項存儲,也有可能是數據傳參數;有時會遇到相反的情況,需要將關係表的相關數據拼接成一個字元串顯示,或傳參。

把格式化的字元串轉化成關係格式,基本思路分為兩種:

  • 利用TSQL的迴圈語句:每一次迴圈都插入到關係表變數或臨時表中,這種思路是面向過程的編程;
  • 使用XML查詢:先把字元串轉化成XML格式,再利用XML的nodes()函數,把XML數據轉化成關係數據;這種思路是面向集合的編程,建議採用XML查詢實現;

把關係格式轉化成字元串,基本思路分為兩種:

  • 利用TSQL的游標,對字元串執行累加連接,這種思路是面向過程的編程;
  • 利用XML查詢的for xml path子句,把關係格式轉化成字元串;這種思路是面向集合的編程,建議採用XML查詢實現;

一,將字元串轉換成表

先把字元串轉換成XML格式,再利用XML的nodes()函數,把XML數據轉化成關係數據,這種實現方式性能快,代碼簡潔,

declare @separator varchar(10)
declare @str varchar(max)
    
set @separator=','
set @str='54,57,55,56,59'

1,把字元串轉化成節點值

每個子串都是節點值,只需要取出節點值,就可以把節點值轉化成關係格式的列值

declare @xml xml
set @xml=convert(xml,'<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>')

SELECT ids=N.v.value('.', 'int') 
FROM @xml.nodes('/v') N(v)

2,把字元串轉化成節點屬性

每個子串都是節點的屬性值,只需要取出節點的屬性值,就可以把屬性值轉化成關係格式的列值

declare @xml xml
set @xml=convert(xml,'<Item v=''' + REPLACE(@str, @separator, '''></Item><Item v=''') + '''></Item>')
    
SELECT ids=N.v.value('@v', 'int') 
FROM @xml.nodes('/Item') N(v)

3,內置表值函數(string_split)

SQL Server 2016 新增一個表值函數string_split,用於按照分隔符將字元串分割成表值數據,返回的欄位名是Value

STRING_SPLIT ( string , separator )  

二,將表數據拼接成字元串

有以下數據表,有兩列:ID和txt,ID值有重覆,而txt是文本數據;

create table dbo.test
(
ID int,
txt varchar(10)
)

把ID欄位相同的txt欄位的值拼接成字元串顯示

select ID
    ,(select a.txt+'' from dbo.test a where a.ID=t.ID for xml path('')) as descr
from dbo.test t 
group by ID

三,奇巧淫技

在master資料庫中,存在一個系統視圖:master.dbo.spt_values,該視圖包含從0到2047的所有數字,利用這個特性,可以把特定長度的字元串轉化成關係格式,實現的代碼如下:

;with cte_numbers as 
(
    select number
    from master.dbo.spt_values
    where type='p'
        and number>0
)
select 
    cast(substring(@str, n.number, charindex(@separator ,@str +@separator ,n.number )-n.number)  as  nvarchar(4000)) as item 
    --,n.number
 from cte_numbers n
 where n.number<=len(@str)+1 
    and charindex(@separator,@separator+@str,n.number)=n.number

對於該方法,要體會其代碼的思路,通過數據序列,從數字1開始,逐個檢測分隔符,對字元串進行分割操作,截取子字元串,從而把字元串轉化成關係表;由於master.dbo.spt_values只有0到2047個順序數字,在必要時,可以替換該系統視圖,而使用自定義的數據序列表,以增加能夠拆分的字元串長度。

在數據開發中,實現字元串和關係格式的相互轉化,我傾向於使用面向集合的查詢,通過面向過程的編程思想來實現,思路直接,比較簡單,在此就不再贅述了。

 

參考文檔:

Why (and how) to split column using master..spt_values?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • BINLOG導出SQL文件 C:\Program Files\MySQL\MySQL Server 5.7\bin>mysqlbinlog binlogpath > sqlfilepath -d dbname -f --stop-datetime stopdatetime --start-datet ...
  • Oracle的sql語句的兩種判斷形式 一類情況詳解:實現的是當num這一列的值為3時,就顯示好 以此類推 1)case num when 3 then '好' when 1 then '不好' else '還行' end taskresult 紅色字是給所判斷的這個列名的別名 可以不寫 如果num ...
  • 故障說明: 遠程調整實例記憶體時疏忽,將實例最大記憶體調整為了0,因此最大記憶體變成了128MB的最小值。 解決方式: 1.正常關閉SQL Server服務,如果是集群,需要先關停止集群角色防止故障轉移,然後再單獨關閉服務。 --註意這一步可能會使實例處於掛起狀態很長時間,但是正常關閉是必須的,直接殺進程 ...
  • 早上打開筆記本想開啟SQL Server服務時報錯,於是根據提示查看windows日誌: 依次點開報錯發現第一條是1433埠被占用,於是找相關的進程: 於是殺掉此進程: 然後啟動SQL Server服務成功。 ...
  • 1、string(key:value類型) 2、hash(name {key1:value1,key2:value2,....}) 3、List(隊列,兩邊均可以取值) 4、set(集合,不重覆數據的集) 5、Sorted set(有序集合,帶權重) ...
  • 這裡整理5個Spark的應用實例,希望對Spark學習者能夠有所幫助 ...
  • 1.KILL掉系統里的MySQL進程; killall -TERM mysqld 2.用以下命令啟動MySQL,以不檢查許可權的方式啟動; mysqld --skip-grant-tables & 3.然後用空密碼方式使用root用戶登錄 MySQL; MySQL -u root 4.修改root用戶 ...
  • 開啟回收站RECYCLEBIN=ON,預設開啟ALTER SYSTEM SET RECYCLEBIN=OFF SCOPE=SPFILE;一、從回收站還原表還原刪除的表和從屬對象。如果多個回收站條目具有相同原始名稱,則:使用系統生成的唯一名稱來還原特定版本使用原始名稱時,還原的表遵循後進先出(LIFO... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...