如何从字符串中获取两个符号之间的子字符串

3

我想要获取在两个操作符之间的子字符串,如=,

我尝试使用CHARINDEXLEFT来获取值,但是我得到的输出类似于CN=Khushwant Khatri,而我想要的输出应该只有Khushwant Khatri

SELECT left([String_value],CHARINDEX(',',([String_value]),0)-1) from trim_string

我的字符串长这样

CN=Khushwant Khatri,OU=TestMig,DC=valjha,DC=vedantaresource,DC=local

CN=Raghav Tare,OU=EXECUTIVE,OU=EXUDR,DC=HZL01,DC=vedantaresource,DC=local

CN=D K Chodankar,OU=Users,OU=AD LotusSync,DC=SGL01,DC=vedantaresource,DC=local

正如您所看到的,字符串具有可变长度。

我只想得到中文值,我的输出应该看起来像: Khushwant Khatri Raghav Tare D K Chodankar


SQL Server 不是处理此需求的最佳选择。最好使用具有 LDAP 库的编程语言来处理此需求。 - Tim Biegeleisen
SQL 版本是多少? - DarkRob
@TimBiegeleisen,您说得完全正确,但我必须在SQL Server中更新近2000个数据,所以我尝试了一下。 - Nits Patel
@DarkRob SQL Server 2012 - Nits Patel
将数据导出到文件,进行正则表达式替换,然后重新导入。 - Tim Biegeleisen
显示剩余8条评论
4个回答

3

使用SUBSTRING()函数

SELECT SUBSTRING(S, 4, CHARINDEX(',', S)-4),
       S
FROM
(
  VALUES
  ('CN=Khushwant Khatri,OU=TestMig,DC=valjha,DC=vedantaresource,DC=local'),
  ('CN=Raghav Tare,OU=EXECUTIVE,OU=EXUDR,DC=HZL01,DC=vedantaresource,DC=local'),
  ('CN=D K Chodankar,OU=Users,OU=AD LotusSync,DC=SGL01,DC=vedantaresource,DC=local')
) T(S);

能否通过列名获取值,而不是硬编码的字符串?因为我需要更新包含近2000个项目的列,不可能编写所有字符串然后转换。 - Nits Patel
如果可能的话,请使用列名共享翻译后的以下编程相关内容: - Nits Patel
1
@NitsPatel 这与 SUBSTRING(Column, 4, CHARINDEX(',', Column)-4) 相同。 - Ilyes

3
您可以尝试以下方法。首先需要找到第一个=的位置,因为名字将从那里开始,然后需要找到以,分隔的名称的长度。因此,我们要找到下一个,的索引,并从到=的字符串长度中减去它。剩余的字符串就是您期望的名称。
我考虑您的第一个值“CN=”可能会因某些条件而变化。
declare @str varchar(max) = 'CN=Khushwant Khatri,OU=TestMig,DC=valjha,DC=vedantaresource,DC=local'

select substring( @str, charindex('=',@str)+1, (charindex(',',@str) - (charindex('=',@str) +1) )) 


根据提供的表格结构详情,请查看以下代码片段。

Create table trim_string ( string_value nvarchar(max) )

Insert into trim_string ( string_value )
values ( 'CN=Khushwant Khatri,OU=TestMig,DC=valjha,DC=vedantaresource,DC=local' )
, ( 'CN=Raghav Tare,OU=EXECUTIVE,OU=EXUDR,DC=HZL01,DC=vedantaresource,DC=local' )
, ( 'CN=D K Chodankar,OU=Users,OU=AD LotusSync,DC=SGL01,DC=vedantaresource,DC=local' )

----- this is your query section
; with cte as (
select string_value ,  substring( string_value, charindex('=',string_value)+1, (charindex(',',string_value) - (charindex('=',string_value) +1) )) newvalue  
 from trim_string )
---- you may store them in temptable
select * into #temp from cte
----or
---- for selection 
select * from cte
----or
-----  use to update
update cte set string_value = newvalue

select * from trim_string


根据评论讨论,请尝试这样做。
; with cte as (
select string_value ,  substring( string_value, charindex('=',string_value)+1, (charindex(',',string_value) - (charindex('=',string_value) +1) )) newvalue  
 from trim_string )
select * from cte


这应该会给出您表中所有字符串记录,其中“Name”将在新列中提取为newvalue

@NitsPatel:我更新了我的答案,请检查。 - DarkRob
所有字符串都具有可变长度和值,我只想使用单行查询获取我在问题中提到的CN值,以便在获取后可以更新我的string_value列。 - Nits Patel
1
@NitsPatel:请再次检查我的编辑答案部分,并运行该查询。 - DarkRob
非常感谢,它完美地运行了,非常感谢您的伟大知识。 - Nits Patel

2

试试这个:

select substring(@t,charindex('=',@t)+1,charindex(',',@t)-4)

0

我不太确定你想要什么。而且使用CHARINDEX也有点不清楚。
但是我认为,也许这段查询语句可以帮助您更好地在字符串中找到所需的内容。

DECLARE @string VARCHAR(MAX) = 'CN=Khushwant Khatri,OU=TestMig,DC=valjha,DC=vedantaresource,DC=local,

,CN=Raghav Tare,OU=EXECUTIVE,OU=EXUDR,DC=HZL01,DC=vedantaresource,DC=local

,CN=D K Chodankar,OU=Users,OU=AD LotusSync,DC=SGL01,DC=vedantaresource,DC=local'

SELECT * 
FROM (
    SELECT -- this part is based on what your question looks it want.
      CASE WHEN LEN(X.value)>2 THEN X.value END AS Value 
    FROM 
        (
        SELECT value    
        FROM  string_split(REPLACE(@string,',','='),'=') -- might help more than CHARINDEX
        ) X
) Y
WHERE Y.Value IS NOT NULL 

1
@EI.Ham 我想要它以列名的形式,我的字符串存储在带有 string_value 列名的表中,我想要更新它,因此需要一个没有硬编码字符串的查询,因为我必须更新近 2000 条记录,所以不可能硬编码所有字符串。 - Nits Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接