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

Sql 从包含多个分隔值的列中提取一个值,sql,sql-server,tsql,sql-server-2008-r2,tokenize,Sql,Sql Server,Tsql,Sql Server 2008 R2,Tokenize,如何从下一列的第六个字段中获取值?我正在尝试获取333字段: ORGPATHTXT 2123/2322/12323/111/222/333/3822 我相信我必须使用select substring,但我不确定如何格式化查询如果您使用的是MySQL,那么您可以使用: select substring_index(orgpathtxt, '/', 6) 我只想说,它在大多数其他数据库中都不太方便 假设SQL Server 我能想到的最简单的方法是创建一个基于“/”分割的分割函数,然后像下面这样

如何从下一列的第六个字段中获取值?我正在尝试获取333字段:

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

我相信我必须使用select substring,但我不确定如何格式化查询如果您使用的是MySQL,那么您可以使用:

select substring_index(orgpathtxt, '/', 6)
我只想说,它在大多数其他数据库中都不太方便

假设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
我在中使用了这个函数

尝试此操作-用于字符串变量或包装到函数中,以便与select查询一起使用


我想提供一个解决方案,使用交叉应用来分割MSSQL中的任何分隔字符串,并返回第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;
这里有一些样品

祝您好运。

对于sql,您可以使用

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

select substring(string,25,27) from table_name 

您还可以使用带有动态管理功能的选项


您使用的是哪种RDBMS?这是否意味着Microsoft的SQL Server?如果是,哪个版本?是的,MS SQL Server v10.50.4000请注意,这违反了规范化;每个字段都应存储在新表的单独一行中,外键指向原始行。@DourHighArch某些层次结构算法使用此模式存储组织层次结构。@TimLehner:这仅适用于字符串变量。否则,选择列表必须放入游标/循环,并使用此方法将结果填充到临时表中。此字段中的值是可变的,所以我怀疑这会起作用为什么sql会与sql Server关联?当我尝试使用它时,我收到一条消息说非法的名称字符我相信这是一个XML解析器错误-您确定数据始终是上述格式吗?您是否尝试过我的SQL FIDLE?数据可以是字母或数字,并且长度可变。我猜您的数据中是否存在与XML冲突的<或>?看起来您可以这样替换这些括号:REPLACEORGPATHTXT,'
declare @string varchar(65) = '2123/2322/12323/111/222/333/3822'

select substring(string,25,27) from table_name 
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