代码之家  ›  专栏  ›  技术社区  ›  mwilson

列表中所有数字都存在的JsonArray的SQL查询

  •  0
  • mwilson  · 技术社区  · 4 年前

    我有一个列名 myNumbers 在SQL中,它是一个json字符串。json是一个int列表。我想查询该表,只返回json中所有int都存在于我提供的列表中的记录。

    | myNumbers |
    -------------
    | [1, 2, 3] |
    | [1, 2]    |
    | [4, 5, 6] |
    | [7, 8, 9] |
    

    示例:我想要所有与数字匹配的记录 (1, 2) 我只会拿回第二件( [1, 2] ). 如果我想要所有与数字匹配的记录 (1, 2, 3) ,我都会回来的 [1, 2, 3] [1, 2]

    我想做的是:

    select * from myTable where JSON_VALUE(myNumbers, '$') in (1, 2, 3)

    但结果并不好。然而,如果我尝试同样的方法,但得到索引,它就会奏效:

    select * from myTable where JSON_VALUE(myNumbers, '$[0]') in (1, 2, 3)

    我尝试了其他几种方法 openjson json_query 但运气不佳。

    有什么方法可以做到这一点吗?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Charlieface    4 年前

    这是关系划分的一个示例,请参见 Joe Celko 等人。

    您可以按如下方式解决此问题:
    让我们假设所需的整数在一列TVP中传递(我会对其进行索引)

    SELECT *
    FROM myTable
    WHERE NOT EXISTS(
        SELECT [value]
        FROM OPEN_JSON(myNumbers, '$') WITH ([value] int '$')
        EXCEPT
        SELECT * FROM @tvp)
    

    如果你想对数字进行硬编码,有一种更简单的方法:

    SELECT *
    FROM myTable
    WHERE NOT EXISTS(
        SELECT [value]
        FROM OPEN_JSON(myNumbers, '$') WITH ([value] int '$')
        WHERE [value] NOT IN (1,2,3))
    

    我们要求所有行:没有JSON int 在列表中,即它们都是。如果列表的大小很大,可能有更快的方法来做到这一点,但这是最简单的方法。