【问题标题】:Extract Code from string从字符串中提取代码
【发布时间】:2014-10-09 10:36:42
【问题描述】:

所以我在 SQL 中有一个这样的字符串

Declare @Denumire varchar(2000) = '''Name''name(109)'',''name (1921)'',''name name name name name (2312)'',''name name name name name (2358)'''

我想要的是检索每个 Name 的每个代码。

在这个例子中是

109,1921,2312,2358

我设法使用查询获得了最后一个代码 2358。

Declare @Cod varchar(20)
    Declare @test varchar(3000) 
    declare @CoduriFinale varchar(2000)
    Declare @rDenumire varchar(3000) = REVERSE(@Denumire)
    SELECT @Cod = LEFT(@rDenumire,CHARINDEX ( ' ' ,@rDenumire , 0))
    SELECT @Cod = REPLACE (@Cod , '(' , '' )
    SELECT @Cod = REPLACE (@Cod , ')' , '' )        
    set @CoduriFinale = REVERSE(RTRIM(LTRIM(SUBSTRING(@Cod,2,6))))+','
    set @test = SUBSTRING(@rDenumire,CHARINDEX (',',@rDenumire, 0),LEN(@rDenumire)) 
    set @rDenumire = @test
    print @CoduriFinale
    print @test

所以我在这里所做的是反转孔字符串(这将确保第一个单词)直到 ' ' 是我的代码,因为我无法让它在 while 循环中为孔执行此操作字符串。

PS:我的字符串实际上是更多用逗号分隔的字符串。

【问题讨论】:

  • T-SQL 在字符串操作方面很糟糕,将数据传递给客户端然后使用正则表达式提取数据会更容易。当然,最好将非规范化数据存储到数据库之前进行解析。如果您担心表的列过多,可以使用sparse columns 存储数百列而影响最小

标签: sql sql-server tsql substring


【解决方案1】:
CREATE   Function [fnRem](@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
    WHILE PATINDEX('%[^0-9,]%', @strText) > 0
    BEGIN
        SET @strText = STUFF(@strText, PATINDEX('%[^0-9,]%', @strText), 1, '')
    END
    RETURN @strText
END






  Declare @test varchar(3000) 

    Declare @Denumire varchar(2000) = '''FABRICOM SYSTEMES D''ASSEMBLAGE (109)'',''VALEO VISION SAS (1921)'',''INERGY AUTOMOTIVE SYSTEMS GERMANY GMBH (2312)'',''TRW AUTOMOTIVE SAFETY SYSTEMS S.R.L. (2358)'''

    set @test =dbo.fnRem(@Denumire)

    select @test

输出 109,1921,2312,2358

【讨论】:

  • 由于 SQL 是一种基于集合的语言,因此应尽可能避免循环和RBAR
【解决方案2】:

尝试与 PATINDEX 一起使用的东西:如下所示

【讨论】:

  • 我猜是名字旁边的 ID,所以他想要一个 ID 结果集。
  • 他想要一个逗号分隔的结果集。
【解决方案3】:

正如您提到的,每个字符串都已经用逗号分隔。只需使用REPLACE 函数将以下所有内容替换为空白字符串('')

The string 'name', the apostrophes ('') and the brackets

这有点像多嵌套的 REPLACE 函数。

当你应用嵌套的 REPLACE 函数时,你会留下数字逗号分隔的字符串。

SELECT REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(@Denumire, '(', ''), ')', ''), 'name', ''), '''', ''), ' ', '')

【讨论】:

  • 这行不通,因为名字是我在这里写的,但是有真名,反正ty。
【解决方案4】:

这会起作用

DECLARE @alphaplace INT,@string varchar(200)='as678678df1234a1s2d3f4@@@'
SET @alphaplace = PATINDEX('%[^0-9]%', @string)
WHILE @alphaplace > 0
BEGIN
SET @string = STUFF(@string, @alphaplace, 1, ',' )

SET @alphaplace = PATINDEX('%[^0-9_,]%', @string)

END
select REPLACE(@string,',,',',') 

【讨论】:

  • 对于'name (109)',结果是,,,109,反正我已经找到解决办法了。
  • 我预计逗号会与我的代码一起使用
【解决方案5】:

我无法添加我的代码。所以添加为图片

OUTPUT
109,1921,2312,2358

【讨论】:

    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多