【问题标题】:SQL - Replace characters with a carriage return & line feed in JSON stringSQL - 用 JSON 字符串中的回车和换行替换字符
【发布时间】:2019-01-29 14:32:43
【问题描述】:

我有一些 JSON 字符串,其中一些匹配以下内容:

{"name":"Example diagnosis 1","code":"111609001","table":"SNOMEDCT","addedby":"EDnurse","dateadded":1548080768169,"qualifier":[{"name":"Qualifier","value":"Confirmed Diagnosis","code":"410605003","prefix":"[C] "},{"name":"Left/Right","value":"Bilateral","code":"51440002","suffix":" - Bilateral"}],"prefix":"[C] ","suffix":" - Bilateral"},{"name":"Example diagnosis 2","code":"371162008","table":"SNOMEDCT","addedby":"EDnurse","dateadded":1548080778007,"qualifier":[{"name":"Qualifier","value":"Confirmed Diagnosis","code":"410605003","prefix":"[C] "},{"name":"Left/Right","value":"Bilateral","code":"51440002","suffix":" - Bilateral"}],"prefix":"[C] ","suffix":" - Bilateral"}

我已经构建了以下 case 语句,它部分工作,并返回以下字符串,并带有回车符和换行符,替换逗号:

{"name":"Example diagnosis 1","code":"111609001","table":"SNOMEDCT","addedby":"EDnurse","dateadded":1548080768169,"qualifier":[{"name":"Qualifier","value":"Confirmed Diagnosis","code":"410605003","prefix":"[C] "},{"name":"Left/Right","value":"Bilateral","code":"51440002","suffix":" - Bilateral"}],"prefix":"[C] ","suffix":" - Bilateral"}
{"name":"Example diagnosis 2","code":"371162008","table":"SNOMEDCT","addedby":"EDnurse","dateadded":1548080778007,"qualifier":[{"name":"Qualifier","value":"Confirmed Diagnosis","code":"410605003","prefix":"[C] "},{"name":"Left/Right","value":"Bilateral","code":"51440002","suffix":" - Bilateral"}],"prefix":"[C] ","suffix":" - Bilateral"}

这是我的 CASE 声明:

select 
     CASE 
          WHEN notevalue LIKE '%"suffix":" - Bilateral"},%'
          THEN REPLACE(substring(LEFT(cast(notevalue as varchar(8000)),DATALENGTH(cast(notevalue as varchar(8000)))-1), 2, 8000),'"suffix":" - Bilateral"},','"suffix":" - Bilateral"}'+CHAR(13)+CHAR(10))
          ELSE substring(LEFT(cast(notevalue as varchar(8000)),DATALENGTH(cast(notevalue as varchar(8000)))-1), 2, 8000)
        END as test
from clinicalnotesdata
where notekey = 'ed diagnosis'
and visitid = '6948'

但是,我还需要将其他 2 个实例添加到我的 CASE 语句中以捕获其他字符串(它们都单独工作)。一旦我将案例的 3 个场景结合起来,它显然与第一个场景匹配并结束。但有时字符串匹配所有 3 个场景。

WHEN notevalue LIKE '%"prefix":"[[]C] "},%'
THEN REPLACE(substring(LEFT(cast(notevalue as varchar(8000)),DATALENGTH(cast(notevalue as varchar(8000)))-1), 2, 8000),'"prefix":"[C] "}],"prefix":"[C] "},','"prefix":"[C] "}],"prefix":"[C] "}'+CHAR(13)+CHAR(10))

WHEN notevalue LIKE '"%prefix":"[[]C] ","suffix":" - Right"},%'
THEN REPLACE(substring(LEFT(cast(notevalue as varchar(8000)),DATALENGTH(cast(notevalue as varchar(8000)))-1), 2, 8000),'"prefix":"[C] ","suffix":" - Right"},','"prefix":"[C] ","suffix":" - Right"}'+CHAR(13)+CHAR(10))

基本上我需要用 CHAR(13)+CHAR(10) 替换特定的逗号,其中满足上述 3 条标准的全部或部分。

有什么想法吗?谢谢。

【问题讨论】:

  • 如果您使用的是更新版本的 SQL Server,那么您可能需要查看它具有的 JSON API。使用它可能比尝试使用基本字符串函数更容易。
  • 是的,谢谢 - 不幸的是我们在 2014 年 :(

标签: sql json tsql case


【解决方案1】:

解决这个问题的最佳方法是使用我称之为 Aliasing with APPLY 的技巧;这是我保持代码 DRYer 的方式(DRY = 不要重复自己)。您可以像这样简化代码:

SELECT 
  CASE
    WHEN CHARINDEX(a.stxt+',',t.notevalue) > 0  --WHEN t.notevalue LIKE '%"suffix":" - Bilateral"},%'
    THEN REPLACE(a2.string,a.stxt+',',a.stxt+CHAR(13)+CHAR(10))
    ELSE a2.string
  END as test
FROM        @clinicalnotesdata AS t
CROSS APPLY (VALUES(CAST(t.notevalue AS VARCHAR(8000)),
                    DATALENGTH(t.notevalue)-1, '"suffix":" - Bilateral"}')) AS a(nval,dl,stxt)
CROSS APPLY (VALUES(SUBSTRING(LEFT(a.nval,DATALENGTH(a.nval)-1), 2, 8000))) AS a2(string)
WHERE       t.notekey = 'ed diagnosis'
AND         t.visitid = '6948';

此代码将执行完全相同的操作,并且如您所见,它更易于理解和重用。例如,CAST(t.notevalue AS VARCHAR(8000) 的所有四个实例都已替换为 a.nvalDATALENGTH(t.notevalue)-1 的两个实例已替换为 a.dl。现在删除了substring(LEFT(cast(notevalue as varchar(8000)),DATALENGTH(cast(notevalue as varchar(8000)))-1), 2, 8000) 的两个实例。

如您所见,我正在使用 VALUES 构造函数和 APPLY 创建内联函数,这些函数只是对重复的代码块起别名。相信我,开始像这样编写你的代码,这样做会变得更容易,否则会导致你把头发拉出来。

【讨论】:

  • 嗨艾伦,这非常有帮助,而且确实更干净 - 谢谢。唯一的问题是它仍然只允许我一次应用 1 个过滤器 - 我需要应用 3 或 4 个过滤器来捕获字符串的所有实例。
猜你喜欢
  • 2013-02-23
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2014-05-17
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多