1. 程式人生 > >SQL Server 根據分隔符依次擷取每個子字串

SQL Server 根據分隔符依次擷取每個子字串

--根據分隔符擷取字串 'Chris,Nancy,Alvin,Sherman,Erick,Josie,Sonia,Joanna'
--法1 根據CHARINDEX函式遞迴求出分隔符在字串中出現的位置,之後根據分隔符擷取字串
--注意:下例中當字元內沒有分隔符時會陷入死迴圈
DECLARE @str VARCHAR(1000)='Chris,Nancy,Alvin,Sherman,Erick,Josie,Sonia,Joanna';
WITH TEMP AS (
SELECT CHARINDEX(',',@str,0) ROWNUM
UNION ALL
SELECT CASE WHEN CHARINDEX(',',@str,ROWNUM+1)=0 THEN len(@str)+1 ELSE CHARINDEX(',',@str,ROWNUM+1) END ROWNUM
FROM TEMP
WHERE ROWNUM<len(@str)
)
SELECT RN=ROW_NUMBER() OVER(ORDER BY ROWNUM)
--,PrivousRN=isNull(LAG(ROWNUM) OVER(ORDER BY ROWNUM),0)
--,ROWNUM
--,(ROWNUM-isNull(LAG(ROWNUM) OVER(ORDER BY ROWNUM),0)) SplitLen
,SUBSTRING(@str,isNull(LAG(ROWNUM) OVER(ORDER BY ROWNUM),0)+1,(ROWNUM-isNull(LAG(ROWNUM) OVER(ORDER BY ROWNUM),0))-1) SplitSTR
FROM TEMP
OPTION(MAXRECURSION 0);

--修改版
DECLARE @str VARCHAR(1000)='Chris,Nancy,Alvin,Sherman,Erick,Josie,Sonia,Joanna';
WITH TEMP AS (
SELECT CHARINDEX(',',@str+',',0) ROWNUM
UNION ALL
SELECT CHARINDEX(',',@str+',',ROWNUM+1) ROWNUM
FROM TEMP
WHERE ROWNUM<LEN(@str)
)
SELECT RN=ROW_NUMBER() OVER(ORDER BY ROWNUM)
--,PrivousRN=isNull(LAG(ROWNUM) OVER(ORDER BY ROWNUM),0)
--,ROWNUM
--,(ROWNUM-isNull(LAG(ROWNUM) OVER(ORDER BY ROWNUM),0)) SplitLen
,SUBSTRING(@str,isNull(LAG(ROWNUM) OVER(ORDER BY ROWNUM),0)+1,(ROWNUM-isNull(LAG(ROWNUM) OVER(ORDER BY ROWNUM),0))-1) SplitSTR
FROM TEMP
OPTION(MAXRECURSION 0);

--法2 根據遞迴先求得一串序列,再根據序列使用charindex函式擷取依次靠近分隔符的字串,之後通過WHERE條件中判斷分隔符位置篩選目標字串
DECLARE @str VARCHAR(1000)='Chris,Nancy,Alvin,Sherman,Erick,Josie,Sonia,Joanna';
WITH TEMP AS 
( 
SELECT 1 AS NUM 
UNION ALL 
SELECT NUM+1 
FROM TEMP 
WHERE NUM<len(@str)
) 
SELECT RN=ROW_NUMBER() OVER(ORDER BY NUM)
,SplitSTR=SUBSTRING(@str,NUM,CHARINDEX(',',@str+',',NUM)-NUM) 
from TEMP 
WHERE SUBSTRING(','
[email protected]
,NUM,1)=',' OPTION(MAXRECURSION 0);

相關推薦

SQL Server 根據分隔符依次擷取個子字串

--根據分隔符擷取字串 'Chris,Nancy,Alvin,Sherman,Erick,Josie,Sonia,Joanna' --法1 根據CHARINDEX函式遞迴求出分隔符在字串中出現的位置,之後根據分隔符擷取字串 --注意:下例中當字元內沒有分隔符時會陷入死迴圈

SQL Server 根據分隔符擷取指定位置的子字串

--擷取分隔符之間的字串 --ChristopherChen 20160804 USE TSQL2012; IF OBJECT_ID('dbo.StringTest', 'U') IS NOT NULL DROP Table dbo.StringTest; GO CR

SQL Server根據表或視圖批量生成插入語句並BCP導出成文本

lower row 創建 index .sql temp length and 空格 --聲明變量 DECLARE @TableName VARCHAR(100),@RunStr VARCHAR(MAX),@RunRC VARCHAR(MAX),@FinalRun VA

sql server 根據身份證號計算出生日期和年齡的存儲過程

ttl 實現 分享 mst () 需要 poc getdate mtr 我這邊有一個業務,需要客戶填寫身份證號,自動計算他的出生日期和年齡 在sql中,具體的存儲過程實現是這樣的: /********************************************

SQL Server 根據樹狀結構表生成以/號分割的路由字串

很多情況下,我們有必要把樹形結構進行資料梳理。比如,要方便的過濾出一個父節點下的所有子節點等等。。。 這個時候,我們可以生成一個路徑表字符串,在應用時只需要對該字串進行索引即可達成目的。 目標:按圖示的部門結構樹,獲取本身的完整路徑字串。比如,前道工序部門,其部門程式碼為PDTE,上級部門為PD生產部,按

SQL Server根據資料庫表,自動生成insert語句,批量新增

實際工作中,兩個資料庫不在同一臺伺服器上,又需要複製資料庫表時,可以在需要複製的資料庫中建立下面的儲存過程。 CREATE PROCEDURE [dbo].[OutputData] @tablename sysname, @

SQL根據行號設定行資料的排序數值

根據行號自動把當前行號插入到某列中 實現排序 update tempTable set DisplayOrder = right( CAST(rownum as NVARCHAR),5) from( &nb

SQL獲取SQL Server 根據表名獲取表的所有列及屬性

select     c.name as [欄位名],t.name as [欄位型別]     ,convert(bit,c.IsNullable)  as [可否為空]     ,convert(bit,case when exists(select 1 from sysobjects where xty

SQL SERVER 根據日期自動生成流水號

----函式中不能使用getdate()函式 ----建立得到當前日期的檢視CREATE VIEW v_GetDateASSELECT nowdate=CONVERT(nvarchar(50),GETDATE(),112)--自動生成訂單編號,長度為14,前8位為年月日,後6

SQL SERVER根據備份建立一個新庫(圖形使用者介面方式)

一、知識點 完全備份: 備份全部選中的資料夾,並不依賴檔案的存檔屬性來確定備份那些檔案。(在備份過程中,任何現有的標記都被清除,每個檔案都被標記為已備份,換言之,清除存檔屬性)。完全備份也叫完整備份。 差異備份: 差異備份是針對完全備份:備份上一次的完全備份後發生變化

SQL Server根據查詢結果,生成XML檔案

/* 'bcp' 不是內部或外部命令,也不是可執行的程式? 看看在C:/Program Files/Microsoft SQL Server/80/Tools/Binn裡面有沒有bcp.exe這個檔案然後看看path裡面加C:/Program Files/Microsoft SQL Server/80/Too

SQL Server中如何實現不固定長度字串字首後固定長度自動補0

實現要求:如 YD01,要變成固定6位長度,YD0001 解決思路: 1  要求出數字出現的第一個位置PATINDEX('%[0-9]%',FIELD)。 2 然後可以取出字首 3 取出數字 4 然後用right方法根據字本身長度和固定長度自動補0 SELE

菜鳥之路 之 C# 通過特殊符號擷取字串

因為有個專案,需要在記錄一段時間的一些資料,菜鳥嘛,也想不出什麼好的辦法來解決: 1、以時間為單位,往資料庫裡面寫入資料,每條記錄只記錄收集的一條資料; 2、在一條記錄中,一個欄位中寫入通過特殊字元

【走馬觀花】SQL SERVER 2012 新增函式詳解-01.字串函式CONCAT

SQLSERVER 2012新增了兩個字串函式CONCAT和FORMAT。首先介紹一下CONCAT,CONCAT函式的作用是可以返回多個字串拼接後的結果。簡單示例:select CONCAT('a','b') as R1 /* R1 ---- ab */ select 'a'

SQL SERVER 擷取多個分隔符中指定第幾個分隔符的前邊的內容

       又是一個難懂的標題,上例子吧,比如一個字串,‘abc,1344,343,13as,33,343’,這個字串都是用','分隔的,現在想擷取第四個逗號前邊所有的內容,方法如下: CREATE FUNCTION [dbo].[Get_StrArra

SQL Server學習記錄之獲取每月季度每年第一天和最後一天

第一天 ediff code spa -1 指定日期 ctc 算法 datetime DECLARE@dtdatetime SET@dt=GETDATE() DECLARE@numberint SET@number=3 --1.指定日期該年的第一天或最後

sql server根據地圖經緯度算距離

use radi 之間 pen fine diff sta _id nbsp 從別的地方烤過來的,自己試了一下,可以計算 出來,不過正確不正確的就不太懂了。 USE [niaoren]GO/****** Object: UserDefinedFunction [d

sql server 查詢某個時間段共有多少周及周的日期段

images first mage 語句 .html cas src exce 時間 sql 語句 select number+1 as wknum,dateadd(wk,number,‘2017-01-01‘) as firstday, (case when year(

SQL SERVER 下:1、遞歸查詢父分類下的各個子分類。 2、查詢每個商品分類中最貴的前兩個商品SQL

nio span clas 適用於 商品 一行 class com 分享圖片 1、遞歸查詢父分類下的各個子分類。表設計: SQL: --CTE 語句(適用於MSSQL2005以後版本) with cte_testNavi(Id,Name,Pid ) as ( --這是查

查詢每個學生門課程的成績,sql server行轉列實現

本人經常寫sql server指令碼,有時需要行轉列,這裡做個筆記。 練習指令碼 -- 學生表 CREATE TABLE student ( stuid VARCHAR(16) NOT NULL, stunm VARCHAR(20) NOT NULL, PRI