簡體   English   中英

如何從 sql 中的逗號分隔字符串中刪除 _ 符號后的值?

[英]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拆分字符串,然后使用LEFTCHARINDEX刪除尾隨字符:

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;

如果下划線可能不在字符串中,您可以使用NULLIFLEN來避免錯誤:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM