【问题标题】:Get two values ​from the same table从同一张表中获取两个值
【发布时间】:2020-06-12 12:54:50
【问题描述】:

我有一个名为 Register 的表

Id、Type_status、状态、描述

例子:

ID      Type_status   Status    Description
1       8000          8017      test

我有一个名为 History 的表,其结构如下

Id、Id_Register、History_status、Payload

例子

Id      Id_Register   History_status    Payload
1       1             8015              {"name": "test"}
2       1             8016              {"token": "example"} 
3       1             8017              {"email": "test@test.com"}

Id_Register = 1History_status8015 和@987654328 时,我需要能够执行一个查询,该查询将为我带来历史表中Record_IdPayload 的值@ 与History_status 8017 是email = test@test.com

预期的结果是

Id_Register      Name    Token
1                test.   example   

我需要以电子邮件test@test.com 的形式获取 8017 状态下记录的所有名称和令牌

提到我已经解决了json中文本的比较,我无法实现的是根据我提到的状态获取同一个表的两个值的查询。

JSON_VALUE(cast(Payload as nvarchar(max)), '$.email') LIKE '%test@test.com%'

【问题讨论】:

  • 那么最终输出应该是什么样子?
  • 也许您需要将有效负载列标准化为有效负载类型和有效负载值之类的内容
  • @Mureinik 更新!
  • SQL Server 版本是多少?
  • @PeterSmith 如何比较json值我已经解决了,但是我无法获取两个寄存器的值只有1个Register_Id...

标签: sql sql-server sql-server-2016 json-query


【解决方案1】:

您只需要将表 History 与表 Register 连接两次。第一次加入将为您提供名称,第二次加入将获得令牌。为了区分每一个,你使用别名。

select R.Id, 
       json_value(N.Payload, '$.Name') as Name, 
       json_value(T.Payload, '$.Token') as Token
from Register as R
     left join History as N on N.Id_Register = R.Id and 
                               substring(N.Payload, 1, 8) = '{"Name":'
     left join History as T on T.Id_Register = R.Id and 
                               substring(T.Payload, 1, 9) = '{"Token":'

【讨论】:

    【解决方案2】:

    也许SQL server手册中的这个条目可以帮助你,这个条目向你展示了如何从一个JSON列中获取一个标量值,这样你就可以只从json中获取电子邮件地址并在你的where子句中使用它来过滤.这个问题的最佳标题是如何从 json 列中获取特定条目,类似这样。

    https://docs.microsoft.com/pt-br/sql/t-sql/functions/json-value-transact-sql?view=sql-server-ver15

    【讨论】:

    • 莱安德罗,感谢您的回复。事实是,问题不在于获取 JSON 值,而在于查询本身,能够访问同一张表的两条记录,但记录 ID 相同。
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2021-09-07
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2020-12-05
    相关资源
    最近更新 更多