Sql 如何反串联字段

Sql 如何反串联字段,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在SQL Server数据库中有一个字段,基本上是两个字段连接在一起。它有一个描述符和一个数字。我想构建一个只包含数字的视图,以便将其与其他表关联。该数字实际上是在其他表中键入的nvarchar。因此,从这样的数据中,我只想查询数字部分: 带有值的程序字段: tst_desc:1 tst_desc:124 tst_desc:1495 tst_desc:20483 因此,我希望我的查询返回以下结果: 程序域 1 124 1495 20483 这个数字在长度上是可变的,随着时间的推移不断增长,

我在SQL Server数据库中有一个字段,基本上是两个字段连接在一起。它有一个描述符和一个数字。我想构建一个只包含数字的视图,以便将其与其他表关联。该数字实际上是在其他表中键入的nvarchar。因此,从这样的数据中,我只想查询数字部分:

带有值的程序字段:

tst_desc:1
tst_desc:124
tst_desc:1495
tst_desc:20483
因此,我希望我的查询返回以下结果:

程序域

1
124
1495
20483
这个数字在长度上是可变的,随着时间的推移不断增长,需要是nvarchar,以便我可以将它与数据库中的其他表关联起来


如果前缀始终为
tst\u desc:
,则只需使用
replace

select
    replace(ProgramField, 'tst_desc:', '') as ProgramNum
from yourTable
如果前缀可以不同,但始终使用冒号与值分隔,则可以使用以下内容:

select
    right(ProgramField, len(ProgramField) - charindex(':', ProgramField)) as ProgramNum
from yourTable

如果前缀始终为
tst\u desc:
,则只需使用
replace

select
    replace(ProgramField, 'tst_desc:', '') as ProgramNum
from yourTable
如果前缀可以不同,但始终使用冒号与值分隔,则可以使用以下内容:

select
    right(ProgramField, len(ProgramField) - charindex(':', ProgramField)) as ProgramNum
from yourTable

@安迪的答案是正确的,你仍然可以检查这个答案

Declare @t table(data varchar(50))
insert into @t values ('tst_desc:1'),  ('tst_desc:2'),  ('tst_desc:124'),  ('tst_desc:1495'),  ('tst_desc:20483')

select 
    Right( data, charindex (':',reverse(data))-1)
from @t

@安迪的答案是正确的,你仍然可以检查这个答案

Declare @t table(data varchar(50))
insert into @t values ('tst_desc:1'),  ('tst_desc:2'),  ('tst_desc:124'),  ('tst_desc:1495'),  ('tst_desc:20483')

select 
    Right( data, charindex (':',reverse(data))-1)
from @t

最简单的方法就是使用东西

SELECT STUFF(ProgramField, 1, charindex(':', ProgramField), '')
FROM yourtable
如果某行中有多个冒号的脏数据或缺少冒号,可以从右到左搜索第一个非数字字符,可以使用此方法,这可以处理各种有趣的数据:

SELECT
  STUFF(RIGHT('@'+ProgramField, PATINDEX('%[^0-9]%',REVERSE(ProgramField)+'@')),1,1,'')

最简单的方法就是使用东西

SELECT STUFF(ProgramField, 1, charindex(':', ProgramField), '')
FROM yourtable
如果某行中有多个冒号的脏数据或缺少冒号,可以从右到左搜索第一个非数字字符,可以使用此方法,这可以处理各种有趣的数据:

SELECT
  STUFF(RIGHT('@'+ProgramField, PATINDEX('%[^0-9]%',REVERSE(ProgramField)+'@')),1,1,'')

您尝试过什么吗?也许您应该首先修复模式,这样它就不会违反1NF-字段应该只包含一个值。在任何情况下,您所要求的是拆分字符串。不过,在这种情况下,您可以简单地从分号的索引抓取字符到字符串的结尾。结果必须右对齐?!有多宽?您尝试过什么吗?也许您应该先修复模式,这样它就不会违反1NF-字段应该只包含一个值。在任何情况下,您所要求的是拆分字符串。不过,在这种情况下,您可以简单地从分号的索引抓取字符到字符串的结尾。结果必须右对齐?!多宽?为什么这比
replace
解决方案“更容易”?为什么这比
replace
解决方案“更容易”?我假设'tst_desc'是测试描述的缩写,在使用真实数据时可能有不同的值。我假设'tst_desc'是测试描述的缩写,在使用真实数据时,可能会有不同的值