SQL Server SQL中自由文本字段的解析

xfb7svmp  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(124)

我的表中有一个字段,其中包含不同类型的数据,这些数据可以转换为不同的列或行。
| 自由文本字段|类型ID|
| - ------|- ------|
| {访视信息} [〈访视日期〉2022年1月1日〈/访视日期〉〈访视类型〉临床〈/访视类型〉] {/访视信息} {费用} [30.91 15.00] {/费用} 1个15.00 ]{/Costs} | 1 |
| [2022 - 03 - 04 I10] {/索引事件} 第二章I10 ]{/Index Events} | 2 |
| {访视信息} [〈访视日期〉2022年10月12日〈/访视日期〉〈访视类型〉行政〈/访视类型〉] {/访视信息} {费用} [25.00] {/费用} 1个]{/Costs} | 1 |
我们的想法是将数据包含在{Category}中,然后将与相关的数据包含在中。我需要编写一个查询,返回如下结果集中的数据: and then the data related to the . I need to write a query that returns the data like in the following result set:
| 类型ID|类别|亚类|结果|
| - ------|- ------|- ------|- ------|
| 1个|访视信息|访视日期|2022年1月1日|
| 1个|访视信息|访视类型|临床|
| 1个|费用|实验室|三十点九一分|
| 1个|费用|遭遇|十五点整|
| 第二章|索引事件|日期|2022年3月4日|
| 第二章|索引事件|诊断|I10|
| 1个|访视信息|访视日期|二〇二二年十月十二日|
| 1个|访视信息|访视类型|行政|
| 1个|费用|咨询|二十五点整|
如果能在使用哪些函数方面为我指出正确的方向,我将不胜感激。
我正在SQL Server 2016上使用SSMS
如果有人想知道,我最终将"{"和"}"值分别替换为"〈"和"〉",并删除了"["和"]"值。
之后,我将字段转换为XML,并使用XML节点解析字段,如下所示:

SELECT
TypeID,
UniqueID,
[Free Text Field],
tbl.col.value('local-name(..)','VARCHAR(MAX)') AS Name,
tbl.col.value('local-name(.)','VARCHAR(MAX)') AS Name,
tbl.col.value('.[1]','VARCHAR(MAX)') AS Value
FROM [My Table] a
CROSS APPLY [My Table].[Free Text Field].nodes('/*/*') AS tbl(col)
72qzrwbm

72qzrwbm1#

如果您的数据看起来像这样,那么它就是有效的XML,并且很容易用XML解析器进行解析
| 自由文本字段|类型ID|
| - ------|- ------|
| <Visit Info><Visit Date>2022-01-01</Visit Date><Visit Type>Clinical</Visit Type></Visit Info><Costs><Laboratory>30.91</Laboratory><Encounter>15.00</Encounter></Costs>|1个|
| <Index Events><Date>2022-03-04</Date><Diagnosis>I10</Diagnosis></Index Events>|第二章|
| <Visit Info><Visit Date>2022-10-12</Visit Date><Visit Type>Administrative</Visit Type></Visit Info><Costs><Consultation>25.00</Consultation></Costs>|1个|

kh212irz

kh212irz2#

你可以用substring做很多事情,比如:

WITH cte AS (
   SELECt 'Visit Info' as category, 'Visit Date' as subcategory  UNION
   SELECt 'Costs' as category, 'Laboratory' as subcategory 
  )
SELECT 
   typeid,
   category,
   subcategory,
   SUBSTRING(ss,y1+len(subcategory)+2,y2-(y1+len(subcategory)+2)) as value
FROM (  
   SELECT 
      typeid,
      category,
      subcategory,
      SUBSTRING(free,x1+len(category)+2,x2-(x1+len(category)+2)) as ss,
      CHARINDEX(CONCAT('<',subcategory,'>'),SUBSTRING(free,x1+(len(category)+2),x2-x1+len(category)+2+1)) as y1,
      CHARINDEX(CONCAT('</',subcategory,'>'),SUBSTRING(free,x1+(len(category)+2),x2-x1+len(category)+2+1)) as y2
   FROM (
      SELECT 
         typeid,
         category,
         free,
         subcategory,
         CHARINDEX(CONCAT('{',category,'}'),free) as x1,
         CHARINDEX(CONCAT('{/',category,'}'),free) as x2
      FROM test
      CROSS APPLY cte )x
   WHERE x1<>0 and x2>x1
) y
WHERE y1<>0 and y2>y1 ;

其他类别和子类别可以用同样的方式完成
此操作的输出:
| 类型标识符|范畴|子范畴|价值|
| - ------|- ------|- ------|- ------|
| 1个|费用|实验室|三十点九一分|
| 1个|访视信息|访视日期|2022年1月1日|
| 1个|访视信息|访视日期|二〇二二年十月十二日|
参见:DBFIDDLE

相关问题