【问题标题】:Extract values from JSON text field for use in "IN" statement SQL从 JSON 文本字段中提取值以用于 \"IN\" 语句 SQL
【发布时间】:2023-01-26 00:40:32
【问题描述】:

在 Azure SQL 服务器中。我有以下(非功能性)查询,它试图使用 JSON 外键数组中的值来查找行,使用“IN”。

SELECT * FROM foo_table WHERE foo_table_id IN (SELECT json_ids_field FROM bar_table WHERE bar_table_id _field= 1);

然而,这会返回一个错误,因为它本身并不理解json_ids_field 中的 JSON 格式。

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the nvarchar value '[29,56,57,71,138,145,195]' to data type int

我如何反序列化该字段,以便将其值聚合到可在 IN 子句中使用的列表中。

【问题讨论】:

  • 您不能获取 JSON 对象并将其与 int 进行比较。您需要将该 JSON 对象转换为数据集(ints)并与之进行比较。你看过 OPENJSON 来使用你的 JSON 数据吗?
  • 我研究过 OPENJSON,但它说应该使用 OPENJSON 来代替您使用表名的时间,我很挣扎,因为理论上 select 语句可以返回多行。所以我不确定如何遍历每个。
  • 你根本不循环;你在FROM中使用OPENJSON

标签: sql json tsql azure-sql-database deserialization


【解决方案1】:

如评论中所述,您需要使用 OPENJSON 来使用您的 JSON 并将其转换为数据集:

SELECT *
FROM dbo.foo_table
WHERE foo_table_id IN (SELECT TRY_CONVERT(int, OJ.value)
                       FROM dbo.bar_table bt
                            CROSS APPLY OPENJSON(bt.json_ids_column) OJ
                       WHERE bt.bar_table_id_column = 1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-01
    • 2022-07-01
    • 2014-01-24
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 2010-12-11
    相关资源
    最近更新 更多