iT邦幫忙

0

SQL Server 字串擷取方式

各位老高,小弟剛學SQL資料庫,不知道什麼方式可以讓左邊這個資料,變成右邊這樣呢?
只是讓它呈現出來而已。
SQL Server 2019版本

https://ithelp.ithome.com.tw/upload/images/20210618/201229282QUkes8AdE.jpg

rogeryao iT邦超人 8 級 ‧ 2021-06-18 13:35:38 檢舉
SQL Server 哪一版 ?
2019
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
rogeryao
iT邦超人 8 級 ‧ 2021-06-18 15:11:23
最佳解答
CREATE TABLE TableX
(ID varchar(20));

INSERT INTO TableX 
VALUES
('3201-20210103001'),
('3201-20210103001_002'),
('3201-20210103001_001'),
('3201-210104001'),
('3201-210104001-ati'),
('3201-210104001_01'),
('3201-210104001_02');
SELECT ID,
d.vals.value('(/TR/TD)[1]','VARCHAR(20)') +'-'+
d.vals.value('(/TR/TD)[2]','VARCHAR(20)') 'ID_1'
FROM (
SELECT ID,
CAST('<TR><TD>' + REPLACE(REPLACE(ID,'_','-'), '-', '</TD><TD>') + '</TD></TR>' AS xml) vals
FROM TableX) AS d

Demo

0
japhenchen
iT邦超人 1 級 ‧ 2021-06-18 13:46:40
DECLARE @s varchar(max)
set @s = '12345-abcde_36789'



-- 2014版之後適用
select top 1 * from STRING_SPLIT(@s,'_')


-- 2014版(含)之前適用
SELECT LEFT(@s, charindex('_', @s) - 1)

看你的題目......... - 跟 _

暈了,我是針對底線 _ 來切割,至於一下 - 一下 _,要動用新版的正則表達式切割法

0
純真的人
iT邦大師 1 級 ‧ 2021-06-18 17:17:31

恩...我也來玩一下@@"

declare @Tmp table(
	StrNo nvarchar(50)
)

insert into @Tmp
values('3201-20210103001'),
('3201-20210103001_002'),
('3201-20210103001_001'),
('3201-210104001'),
('3201-210104001-ati'),
('3201-210104001_01'),
('3201-210104001_02');

select *
,left(StrNo,PatIndex('%[-]%',StrNo))
+ left(
	replace(StrNo,left(StrNo,PatIndex('%[-]%',StrNo)),'')
	,
	(
		case when PatIndex('%[-_]%',replace(StrNo,left(StrNo,PatIndex('%[-]%',StrNo)),'')) = 0
		then len(replace(StrNo,left(StrNo,PatIndex('%[-]%',StrNo)),''))
		else PatIndex('%[-_]%',replace(StrNo,left(StrNo,PatIndex('%[-]%',StrNo)),'')) - 1
		end
	)
) TmpStr
from @Tmp

https://ithelp.ithome.com.tw/upload/images/20210618/20061369hdmQAiCxhc.png

我要發表回答

立即登入回答