我有一个表格如下:
id | 中 | 手机 | 优惠券 | 状态 |
---|---|---|---|---|
1 | 1 | 0811111111 | 1 | 1 |
2 | 1 | 08222222222 | 2 | 1 |
3 | 1 | 08222222222 | 3 | 1 |
4 | 1 | 08222222222 | 4 | 1 |
5 | 1 | 08111111111 | 5 | 1 |
6 | 2 | 08333333333 | 6 | 1 |
7 | 2 | 08333333333 | 7 | 1 |
8 | 2 | 08444444444 | 8 | 1 |
----- | ----- | --------------- | -------- | ------- |
我想在 WHERE
列上使用 mId
子句查询表并过滤 couponno
或列在 handphone
数字上。如何查询?
我想要的结果是:
{
"08111111111": [{
"Id": 1,
"CouponNo": 1,
"Status": 1
}, {
"Id": 5,
"CouponNo": 5,
"Status": 1
}],
"08222222222": [{
"Id": 2,
"CouponNo": 2,
"Status": 1
}, {
"Id": 3,
"CouponNo": 3,
"Status": 1
}, {
"Id": 4,
"CouponNo": 4,
"Status": 1
}]
}
答案 0 :(得分:0)
要求 Handphone
作为 JSON 中的对象键会导致难以从 SQL 生成,并且随着时间的推移添加更多数据,接收端也可能无法很好地扩展。
这里是一些基于数据透视的 SQL,可以生成您想要的 JSON...
create table dbo.PivotJsonStuff (
Id int,
[Mid] int,
Handphone varchar(11),
CouponNo int,
Status int
);
insert dbo.PivotJsonStuff (Id, [Mid], Handphone, CouponNo, Status)
values
(1, 1, '08111111111', 1, 1),
(2, 1, '08222222222', 2, 1),
(3, 1, '08222222222', 3, 1),
(4, 1, '08222222222', 4, 1),
(5, 1, '08111111111', 5, 1),
(6, 2, '08333333333', 6, 1),
(7, 2, '08333333333', 7, 1),
(8, 2, '08444444444', 8, 1);
select
[08111111111] = json_query([08111111111]),
[08222222222] = json_query([08222222222])
from (
select Handphone,
[JSON] = (
select PJS2.Id, PJS2.CouponNo, PJS2.Status
from dbo.PivotJsonStuff PJS2
where PJS2.Handphone = PJS1.Handphone
for json path
)
from dbo.PivotJsonStuff PJS1
group by Handphone
) src
pivot (max([JSON]) for Handphone in ([08111111111], [08222222222])) pvt
for json path, without_array_wrapper;
{
"08111111111": [
{
"Id": 1,
"CouponNo": 1,
"Status": 1
},
{
"Id": 5,
"CouponNo": 5,
"Status": 1
}
],
"08222222222": [
{
"Id": 2,
"CouponNo": 2,
"Status": 1
},
{
"Id": 3,
"CouponNo": 3,
"Status": 1
},
{
"Id": 4,
"CouponNo": 4,
"Status": 1
}
]
}