[英]How to remove values after _ sign from comma separated string in sql?
如何在 sql 中刪除 _ 后的值。
以下是樣本數據:1_1,2_2,3_3,4_40
Sql 代碼
Declare @var1 nvarchar(max)
Set @var1 ='1_1,2_2,3_3,4_40'
Select @var1
Output 需要:1,2,3,4
假設您使用的是完全支持的 SQL 服務器版本,您可以使用STRING_SPLIT
拆分字符串,然后使用LEFT
和CHARINDEX
刪除尾隨字符:
DECLARE @var1 nvarchar(MAX);
SET @var1 = N'1_1,2_2,3_3,4_40';
SELECT LEFT(SS.[value], CHARINDEX('_', SS.[value]) - 1)
FROM STRING_SPLIT(@var1,',') SS;
如果下划線可能不在字符串中,您可以使用NULLIF
和LEN
來避免錯誤:
DECLARE @var1 nvarchar(MAX);
SET @var1 = N'1_1,2_2,3_3,4_40,5';
SELECT LEFT(SS.[value], ISNULL(NULLIF(CHARINDEX('_', SS.[value]),0) - 1,LEN([value])))
FROM STRING_SPLIT(@var1,',') SS;
如果您沒有使用完全受支持的 SQL 服務器版本,則需要使用 UDF(例如DelimitedSplit8k_LEAD
)、XML 拆分器或創建 CLR ZC1C425268E683945D
Declare @var1 nvarchar(max)
Set @var1 ='1_1,2_2,3_3,4_40'
select STUFF( (SELECT ',' + value as [text()]
from (
select
left(value, CHARINDEX('_', value )-1) value
from string_split (@var1,',')
) s
for xml path ('')), 1, 1, NULL) as Clean_var1
分而治之,首先按''拆分為列,然后在'_'上找到Position,以顯示正確的值是數字多於一個,最后重建以將所有新值顯示為CSV使用Z0F635D0E10F3874CF78B
您可以應用STRING_SPLIT function 兩次。 首先獲取以逗號分隔的值,然后獲取以_分隔的數字,返回第一個數字。
declare @var1 varchar(max) = '1_1,2_2,3_3,4_40';
select (select top 1 value from string_split(value, '_'))
from string_split(@var1,',');
所以我沒有 Sql 服務器 2016。因此我無法使用 STRING_SPLIT。 我所做的是創建一個用戶定義的 Function 代替 String_Split
CREATE FUNCTION [dbo].[fnSplit](
@sInputList VARCHAR(8000) -- List of delimited items
, @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))
BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
BEGIN
SELECT
@sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
@sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))
IF LEN(@sItem) > 0
INSERT INTO @List SELECT @sItem
END
IF LEN(@sInputList) > 0
INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
之后我在下面做了
DECLARE @var1 nvarchar(MAX);
SET @var1 = N'1_1,2_2,3_3,4_40';
SELECT LEFT(SS.[value], CHARINDEX('_', SS.[value]) - 1)
FROM [dbo].[fnSplit](@var1,',') SS;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.