【问题标题】:Trimming the beginning and end of string in SQL在 SQL 中修剪字符串的开头和结尾
【发布时间】:2021-05-12 07:33:54
【问题描述】:

我有一个很长的字符串,我想修剪它的开头和结尾。请参阅下面的随机示例:

{ "topic":"birds", "body":"cool bird", "attachment1":"bird1", "attachment2":"anotherbird" }

我想要的输出:

“附件1”:“鸟1”,“附件2”:“另一只鸟”

我想保留附件,所以我必须将所有内容修剪到第一个附件“附件 1”,并去掉“}”以及多余的空间。

仅供参考-我正在使用 SQL Server。任何反馈或建议都会非常有帮助!谢谢你。 :)

编辑:如果在字符串中找不到 '"attachment1":',我希望该值返回 NULL 而不是返回原始字符串。我将如何修改答案以包含此规则?

【问题讨论】:

  • 为什么不把它当作它本来的样子,JSON,然后把值像那样取出呢?
  • 我将不得不研究 JSON。感谢您的建议! @Larnu

标签: sql sql-server string split trim


【解决方案1】:

你可以使用:

select replace(stuff(str, 1, charindex('"attachment1":', str), ''), ' }', '')

Here 是一个 dbfiddle。

编辑:

处理丢失的"attachment" 可能最简单的解决方案是使用case:

select (case when str like '%"attachment1"%' 
             then replace(stuff(str, 1, charindex('"attachment1":', str), ''), ' }', '')
        end)

【讨论】:

  • 正是我需要的!非常感谢。
  • 您好,我对此有疑问。如果在字符串中找不到 '"attachment1":',我希望该值返回 NULL 而不是返回原始字符串。我将如何修改您的代码以包含此规则? @GordonLinoff
【解决方案2】:

在 SQL Server 2016 及更高版本中使用 JSON API。

STRING_AGG() 函数在 SQL Server 2017 及更高版本中可用。

这种方法的美妙之处在于“attachment%”键/值对可以位于任何位置。

SQL

DECLARE @JSON NVARCHAR(MAX) = N'{ "topic": "birds", "body":"cool bird", "attachment1":"bird1", "attachment2":"anotherbird" }';

;WITH rs AS
(
    SELECT [key], [value]
    FROM OPENJSON(@JSON)
)
SELECT STRING_AGG(FORMATMESSAGE('"%s":"%s"', [key], [value]), ',') AS Result
FROM rs
WHERE rs.[key] LIKE 'attachment%';

输出

+----------------------------------------------------+
|                       Result                       |
+----------------------------------------------------+
| "attachment1":"bird1","attachment2":"anotherbird"  |
+----------------------------------------------------+

【讨论】:

  • 非常感谢!
  • FORMATMESSAGE??你为什么不直接CONCAT('"', [key], '":"', [value], '"')
  • @Charlieface,更简单,类似于string.format().Net函数。
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
  • 2011-02-06
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多