【发布时间】:2018-01-20 08:30:57
【问题描述】:
第一篇文章 - 我试图从一个字段中提取十个不同的信息。让我从这不是我的桌子开始,这只是我被赋予的工作。这是一个 varchar max 字段。
'3350|@|1234567|~|3351|@|8/1/2017|~|3352|@|Acme|~|3353|~|10000.00|~|3354|@||~|3355|@||~3356|@|Yes|~|3357|@|Doe,John|~|3358|@|CA|~|3359|@|5551212'
我知道以 33 开头的数字是告诉我该部分中包含哪些信息的键。 3350 的发票为 #1234567。 3351 的发票日期为 2017 年 8 月 1 日。等 3354 和 3355 为空。键是不变的,并且对于表中的每条记录都是相同的。
我需要从 3350|@| 之间提取数据和 |~|3351 获取我的发票# 和 3351|@| 之间和 |~|3352 来获取我的日期等,但我正在努力解决这个问题。任何帮助将不胜感激,对我的第一篇文章的任何批评都将被建设性地接受。
【问题讨论】:
-
您运行的是什么版本的 SQL?我认为在
~上拆分字符串可能是最简单的,从而产生一个包含每个数据块的表。从那里,您可以很容易地对每个单独的值进行子串化。如果您运行的是 SQL 2016+,则有一个本机字符串拆分功能。否则,你必须自己动手。 -
您是否只从单个记录的这一字段中提取数据?还是您必须跨多行执行此操作?
-
我建议您从获取字符串拆分器例程开始(或者,如果您使用的是 SQL Server 2016 或更高版本,请使用内置的 SPLIT_STRING() 函数)。在
|~|或只是波浪号上拆分字符串。然后你就有了多个片段。在片段上使用CHARINDEX()和LEFT()/RIGHT()(或SUBSTRING()),很容易得到你要找的信息 -
请注意,如果将字符串拆分为波浪号,则需要从单个数据片段中删除任何前导或尾随管道字符,以便于处理。例如第一项是
3350|@|1234567|(没有前导管道),最后一项是'|3359|@|5551212'(没有尾随管道),中间的所有项目都有前导管道和尾随管道。在|~|上拆分消除了前导和尾随管道。 -
我在 SQL2008 上运行,这将跨多行完成。我将研究字符串拆分。感谢大家的快速回复。
标签: sql-server substring