Sql 从包含多个分隔值的列中提取一个值
如何从下一列的第六个字段中获取值?我正在尝试获取333字段: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 我能想到的最简单的方法是创建一个基于“/”分割的分割函数,然后像下面这样
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