【问题标题】:Checking to see if one or more ids is in a json string检查一个或多个 id 是否在 json 字符串中
【发布时间】:2020-02-12 21:25:21
【问题描述】:

如果表中有以下行:

clientId    settings
1           {"franchises":[1,7,9,11,14,20,23,26,27,29,33,34,35,45,49,50,57,58,72,73]}
2           {"franchises":[1]}
3           {"franchises":[50]}

我将如何查询以提取拥有特许经营权 1 或 50 的 clientId?

我试过了

SELECT clientId FROM clientSettings WHERE JSON_VALUE(settings, '$.franchises') IN (1,50)

但这没有用。

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?

标签: sql arrays json sql-server tsql


【解决方案1】:

可以使用json函数:

select distinct c.clientId
from clientSettings c
cross apply openjson(c.settings, '$.franchises') with (franchise integer '$')
where franchise in (1, 50);

将其包装在 exists 中可能会更好,因为它避免了聚合的需要:

select c.clientId
from clientSettings c
where exists (
    select 1
    from openjson(c.settings, '$.franchises') with (franchise integer '$')
    where franchise in (1, 50)
)

Demo on DB Fiddle(我在您的数据集中添加了一条不匹配的行,id 为4):

|客户 ID | | --------: | | 1 | | 2 | | 3 |

【讨论】:

  • 这是 tsql 吗?我正在尝试在 sql 2019 实例上运行它,它说“'$' 附近的语法不正确”
  • @Brds:这确实是 tsql。它使用您的示例数据在 SQL 2019 上运行良好,如您所见 in this DB Fiddle
【解决方案2】:

另一种不需要排序或聚合的方式。

DECLARE @clientSettings TABLE (ClientId INT IDENTITY, Settings VARCHAR(8000));

INSERT @clientSettings(settings)
VALUES
('{"franchises":[0,7,9,11,14,20,23,26,27,29,33,34,35,45,49,55,57,58,72,73,1,50]}'),
('{"franchises":[1]}'),
('{"franchises":[50]}');

SELECT c.clientId
FROM   @clientSettings c
CROSS APPLY
(
    SELECT TOP (1) f.franchise
    FROM   OPENJSON(c.settings, '$.franchises') WITH (franchise INT '$') AS f
    WHERE  f.franchise IN (1, 50)
) AS x;

【讨论】:

    【解决方案3】:

    请尝试使用“CROSS APPLY OPENJSON”进行以下查询 (SQL-FIDDLE):

    SELECT c.clientId
    FROM clientSettings c
    CROSS APPLY OPENJSON(c.settings, '$.franchises') with (franchise integer '$') as f
    WHERE f.franchise in (1, 50)
    GROUP BY c.clientId;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 2013-08-20
      • 2020-07-16
      • 2021-07-07
      • 2019-05-11
      相关资源
      最近更新 更多