2016-12-21 127 views
0

我需要从字符串中获取特定部分。如何从SQL中的字符串中获取特定部分

在以下示例字段POSITION包含A-块时,块M-0000000359和最后块的/的权利。

我现在需要的是/右边的全部数字,如果有一个,只有完整的数字到逗号。

所以如果POSITION下一输出将A-M-0000000359/10A-M-0000000359/10,10那么现在我需要的结果是在这两种情况下10

SQL

SELECT POSITION 
    ,SUBSTRING((REPLACE(POSITION, SUBSTRING((POSITION), 1, CHARINDEX('/', (POSITION), 1)), '')), 1, CHARINDEX('/', (POSITION), 0)) AS TRIM_A 
    ,SUBSTRING((REPLACE(POSITION, SUBSTRING((POSITION), 1, CHARINDEX('/', (POSITION), 1)), '')), 0, CHARINDEX(',', ((REPLACE(POSITION, SUBSTRING((POSITION), 1, CHARINDEX('/', (POSITION), 1)), ''))), 1)) AS TRIM_B 
    ,* 
FROM ORDER 

输出

POSITION    |TRIM_A|TRIM_B 
---------------------|------|------| 
A-M-0000000359/1  |1 
---------------------|------|------| 
A-M-0000000359/1,10 |1,10 1 
+0

你的榜样显示你想要的固定位置。这是真的吗? –

+0

这个例子(SQL&Output)是我现在被卡住的地方。你看到的输出有效,如果这确实回答你的问题。 – oldsport

+0

那么你现在的代码有什么问题? – scsimon

回答

3

您可以用CASE语句做到这一点呢。更改@position变量进行测试。

declare @position varchar(64)= 'A-M-0000000359/1111,10' 

select 
    case 
     when patindex('%,%',@position) > 0 
     then substring(substring(@position,CHARINDEX('/',@position) + 1,len(@position) - CHARINDEX('/',@position)),1,patindex('%,%',substring(@position,CHARINDEX('/',@position) + 1,len(@position) - CHARINDEX('/',@position))) - 1) 
     else substring(@position,CHARINDEX('/',@position) + 1,len(@position) - CHARINDEX('/',@position)) 
    end 
+0

Thx!但它只给我最后一个数字('10')。但它应该基于你的例子'1'。 – oldsport

+0

固定它,因为你想要第一个。现在尝试@oldsport – scsimon

+0

而不是'patindex()',我只会使用'like'。 –

1

也许一个打火机替代

Declare @YourTable table (Position varchar(50)) 
Insert Into @YourTable values 
('A-M-0000000359/1,10'), 
('A-M-0000000359/1'), 
('A-M-0000000359') 


Select A.* 
     ,Trim_A = case when charindex('/',Position)=0 then '' else substring(Position,charindex('/',Position)+1,50) end 
     ,Trim_B = case when charindex(',',Position)=0 then '' 
        else substring(Position,charindex('/',Position)+1,charindex(',',Position)-charindex('/',Position)-1) 
        end 
From @YourTable A 

返回

Position    Trim_A Trim_B 
A-M-0000000359/1,10 1,10  1 
A-M-0000000359/1  1 
A-M-0000000359  
+0

当没有任何/ – scsimon

+0

@scsimon的时候,我们会采取额外措施的荣誉当用户回来时,总是感到震惊:“这有效,但我也有这个条件,这个家伙有3个解决方案,每次都有另一滴信息。http://stackoverflow.com/questions/41232461/sql-server-need-to-correct-the-numbering-pattern-from-abc-1-1-1-to-abc- 001-001/41232574#41232574 –

1

能否请您试试这个,我发现它很简单,易于理解,我们可以简单地做它用CASE

create table #test(block varchar(50)) 

insert into #test values 
('A-M-0000000359/10,11'), ('A-M-0000000359/10') 

select substring(block, charindex('/', block)+1, 
    case when charindex(',', block) = 0 then 
     len(block) 
    else 
     (charindex(',', block)-1)-charindex('/', block) 
    end) finalValue 
from #test 

OUTPUT 
---------- 
finalValue 
10 
10 
相关问题