从包含多个分隔值的列中提取一个值

时间:2013-01-31 21:56:36

标签: sql sql-server tsql sql-server-2008-r2 tokenize

如何从以下列的第六个字段中获取值?我想要获得333领域:

ORGPATHTXT
2123/2322/12323/111/222/333/3822

我认为我必须使用select substring,但我不确定如何格式化查询

6 个答案:

答案 0 :(得分:2)

  

假设SQL Server

我能想到的最简单的方法是创建一个基于'/'分割的分割函数,然后像下面一样提取第六个项目

declare @text varchar(50) = '2123/2322/12323/111/222/333/3822'

select txt_value from fn_ParseText2Table(@text, '/') t where t.Position = 6

我使用了this url中的功能。 See it worked at SQLFiddle

答案 1 :(得分:2)

尝试此操作 - 用于字符串variable或包装到function以用于选择查询(Sql-Demo

Declare @s varchar(50)='2123/2322/12323/111/222/333/3822'

Select @s = right(@s,len(@s)- case charindex('/',@s,1) when 0 then len(@s) 
                              else charindex('/',@s,1) end)
From ( values (1),(2),(3),(4),(5)) As t(num)

Select case when charindex('/',@s,1)>0 then left(@s,charindex('/',@s,1)-1) 
            else @s end

--Results
333

答案 2 :(得分:1)

我想提供一个解决方案,使用CROSS APPLY拆分MSSQL中的任何分隔字符串,ROW_NUMBER()返回第6个元素。这假设您有一个ORGPATHTXT作为字段的表(虽然它可以很容易地转换为没有表的工作):

SELECT ORGPATHTXT
FROM (
  SELECT 
    Split.a.value('.', 'VARCHAR(100)') AS ORGPATHTXT,
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT 1)) RN
  FROM  
    (SELECT ID, CAST ('<M>' + REPLACE(ORGPATHTXT, '/', '</M><M>') + '</M>' AS XML) AS String  
     FROM  MyTable
  ) AS A 
  CROSS APPLY String.nodes ('/M') AS Split(a)
  ) t 
WHERE t.RN = 6;

以下是一些示例Fiddle

祝你好运。

答案 3 :(得分:1)

对于sql,您可以使用

declare @string varchar(65) = '2123/2322/12323/111/222/333/3822'

select substring(string,25,27) from table_name 

答案 4 :(得分:0)

如果您使用的是MySQL,那么您可以使用:

select substring_index(orgpathtxt, '/', 6)

我只想说在大多数其他数据库中不太方便。

答案 5 :(得分:0)

此外,您还可以使用动态管理功能选项sys.dm_fts_parser

DECLARE @s nvarchar(50) = '2123/2322/12323/111/222/333/3822' 

SELECT display_term
FROM sys.dm_fts_parser('"'+ @s + '"', 1033, NULL, 0) 
WHERE display_term NOT LIKE 'nn%' AND occurrence = 6