【问题标题】:How to get a exact number from a String in sql server?如何从 sql server 中的字符串中获取确切的数字?
【发布时间】:2019-09-26 00:05:00
【问题描述】:

如何从 SQL server 2014 数据库中的以下 TrigParams 字段获取订单号 (189,190)。

TrigParams

{"OWLSObjKey":{"key":"OWLSObjKey","value":"189","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"189","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}
{"OWLSObjKey":{"key":"OWLSObjKey","value":"190","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"190","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}

【问题讨论】:

  • SQL Server 版本?你试过什么?
  • 这不是一个好问题,会迫使人们猜测。表的架构是什么,服务器版本是什么?这个字符串是单个字段的内容还是两行的内容? SQL Server 2016 及更高版本支持 JSON,这意味着您可以使用 JSON_VALUE 来检索数据。但是,如果该字符串是 single 值,则它是无效的 JSON
  • 您打算如何使用这些值?在结果中返回它们?将它们与其他数据一起加入?您可能必须在每种情况下使用不同的 JSON 函数
  • 您好,这是来自 SQL Server 2014 数据库。此字段与 SAP B1 OWLS 表相关。我需要获取此值才能通过 DocEntry 的主键加入 ORDR 表(订单详细信息)

标签: sql json sql-server tsql sql-server-2014


【解决方案1】:

您从其他答案中看到,具有广泛 JSON 支持的 SQL-Server 2016+ 将有很大帮助。但没有你也不会迷失。您可以使用字符串方法:

感谢 Panagiotis Kanavos 的 MCVE

declare @table table (trigparams nvarchar(2000))

insert into @table 
values
('{"OWLSObjKey":{"key":"OWLSObjKey","value":"189","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"189","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}'),
('{"OWLSObjKey":{"key":"OWLSObjKey","value":"190","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"190","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}')

--这是查询

select LEFT(CutOff,CHARINDEX('"',CutOff)-1)
from @table t
CROSS APPLY(SELECT STUFF(t.trigparams,1,CHARINDEX('"value":"',t.trigparams)+8,'')) A(CutOff);

简而言之:

APPLY 中,我们将使用STUFF() 在第一个字符上写入nothing,直到您要查找的数字(在第一次出现"value":" 之后。返回为列CutOff。我们现在可以使用LEFT() 仅选择数字。

【讨论】:

    【解决方案2】:

    该问题未指定服务器版本、表架构或字符串是表示单个值还是两个单独行的内容。

    我只是假设它是支持 JSON 的 SQL Server 2016,并且文本来自两个单独的行。我还将假设查询只需要将数据作为单个值返回。

    在这种情况下,对JSON_VALUE('$.OWLSObjKey.value') 的简单调用将返回数据。 JSON_VALUE 从格式良好的 JSON 字符串返回单个值:

    declare @table table (trigparams nvarchar(2000))
    
    insert into @table 
    values
    ('{"OWLSObjKey":{"key":"OWLSObjKey","value":"189","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"189","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}'),
    ('{"OWLSObjKey":{"key":"OWLSObjKey","value":"190","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"190","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}')
    
    select JSON_VALUE(trigparams,'$.OWLSObjKey.value') As SomeKey
    from @table
    

    这会返回:

    SomeKey 
    189 
    190 
    

    【讨论】:

    • 您好,这是来自 SQL Server 2014 数据库。此字段与 SAP B1 OWLS 表相关。我需要获取此值才能通过 DocEntry 的主键加入 ORDR 表(订单详细信息)。
    【解决方案3】:

    假设您使用的是 SQL Server 2016+,请使用OPENJSON

    SELECT O.OrderNumber
    FROM (VALUES('{"OWLSObjKey":{"key":"OWLSObjKey","value":"189","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"189","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}'),
                ('{"OWLSObjKey":{"key":"OWLSObjKey","value":"190","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"190","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}')) V(TrigParams)
         CROSS APPLY OPENJSON(V.TrigParams) WITH (OWLSObjKey nvarchar(MAX) AS JSON) OK
         CROSS APPLY OPENJSON(OK.OWLSObjKey) WITH (OrderNumber int '$.value') O;
    

    如果不是,那么如果不使用 CLR 函数,SQL Server 就不是你的朋友。如果您不能使用 CLR,那么我建议您使用其他工具来读取 JSON 值。

    【讨论】:

    • 听听为什么这有一个 Downvote 会很有趣。为什么/如何改进?
    • 嗯,显然选民认为沉默是金。耻辱。
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 2011-04-14
    • 2021-12-09
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2021-07-03
    相关资源
    最近更新 更多