【问题标题】:SQL returning empty JSON brackets when no value found instead of empty "value"当没有找到值而不是空的“值”时,SQL 返回空的 JSON 括号
【发布时间】:2020-09-29 06:40:42
【问题描述】:

我有一个 sql 查询,它将检查一个名为 USER_PROFILE_ENTRY 的表在下面给出的特定 where 子句下的 STRING_VAL 并将其设置为 extension_locale强>

    Select extension_locale = (select STRING_VAL from USER_PROFILE_ENTRY
            where PROFILE_KEY = 'Culture' and ottr.USER_ID = USER_PROFILE_ENTRY.USER_ID)
            from USER_DATA ottr where USER_TYPE = 'U'
            FOR JSON PATH

where 子句中的 ottr.USER_ID 来自名为 USER_DATA 的表,因此当您运行以下查询并且没有满足此条件的值时 -> ottr.USER_ID = USER_PROFILE_ENTRY.USER_ID 则不会返回任何内容

select STRING_VAL from USER_PROFILE_ENTRY
            where PROFILE_KEY = 'Culture' and ottr.USER_ID = USER_PROFILE_ENTRY.USER_ID

但我想要的是,如果上面 where 条件没有值,它应该打印 扩展时区 = "" 而不是根本不打印任何东西。

以下是上述查询的输出:

[
  {},
  {
    "extension_locale": "en-US"
  },
  {},
  {
    "extension_locale": "en-US"
  },
  {
    "extension_locale": "en-GB"
  },
  {},
  {},
  {
    "extension_locale": "en-GB"
  },
  {
    "extension_locale": "en-GB"
  },
  {
    "extension_locale": "en-GB"
  }
]

所以如果你看到输出,有很多 {} (空块),这意味着没有令人满意的 where 子句因此和空输出,但我想要的是这样的:

[
  {
    "extension_locale": ""
  },
  {
    "extension_locale": "en-US"
  },
  {
    "extension_locale": "en-US"
  },
  {
    "extension_locale": "en-GB"
  },
  {
    "extension_locale": ""
   },
  {
    "extension_locale": ""
  },
  {
    "extension_locale": "en-GB"
  },
  {
    "extension_locale": "en-GB"
  },
  {
    "extension_locale": "en-GB"
  }
]

 

【问题讨论】:

  • 对于 2008 年的 json 路径?你是巫师吗?
  • 你能发布测试数据吗?另请注意,SQL Server 2016 中引入了 JSON 支持,因此 sql-server-2008 标记似乎是错误的。您的实际 SQL Server 版本是多少?
  • 你想要什么类型的测试数据?我有 2 个表,一个是 USER_DATA,另一个是 USER_PROFILE_ENTRY,两个表都有一个公共列,即我在 where 子句中使用的 USER_ID
  • 不是这样的。阅读sql tag infoedit 中的指南,并使用适当的示例数据来解决您的问题 - 并修复错误的标签。那我也许能帮你。
  • @ZoharPeled 我有 2 个表,一个是 USER_DATA,另一个是 USER_PROFILE_ENTRY,两个表都有一个公共列,即我在 where 子句中使用的 USER_ID。我希望我能让你明白

标签: sql json sql-server


【解决方案1】:

你有两个选择:

  • FOR JSON AUTO 中使用INCLUDE_NULL_VALUES 选项。在这种情况下,结果是生成的输出中的 "extension_locale": null 键\值对
  • 当内部SELECT 语句的返回值为NULL 时,使用COALESCE() 返回默认值。然后结果是最终 JSON 中的 "extension_locale": "" 键\值对。

没有测试数据是很困难的,但是下面的例子,基于你的代码,是一个可能的选择:

SELECT extension_locale = COALESCE(
   (
   SELECT STRING_VAL 
   FROM USER_PROFILE_ENTRY 
   WHERE PROFILE_KEY = 'Culture' AND ottr.USER_ID = USER_PROFILE_ENTRY.USER_ID
   ),
   ''
)
FROM USER_DATA ottr 
WHERE USER_TYPE = 'U'
FOR JSON PATH

【讨论】:

  • 它有效我试图为此使用 CASE,但无法找到解决方案。将此标记为答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多