【发布时间】:2019-02-14 21:11:08
【问题描述】:
我正在从旧系统迁移数据。我有一些布尔列,可以是True、False 或Null。每一列都有一定的含义。在新数据库中,我使用 JSON Data 对象。我想要实现的是:
OldTable:
ValueA, ValueB, ValueC, ValueD
Null , True , False , True
我现在使用旧表上的选择和FOR JSON 创建 Json 数据以获取 Json 对象。该对象应如下所示:
{
myObject: {
data: "valueB, ValueD"
}
}
我的问题是将值附加到相同的“数据”字段。
所以现在我只能使用这样的单个值:
SELECT CASE WHEN ValueA == True THEN 'ValueA' END 'myObject.data',
CASE WHEN ValueB == True THEN 'ValueB' END 'myObject.data'
FROM myLegacyTable FOR JSON Path
这显然会覆盖myObject.data 中的内容,只要两个值都为真。 JSON_MODIFY 似乎不是一个选项,因为我不是在处理现有的 Json 对象,而是创建一个新对象。也许其他人有想法?
【问题讨论】:
-
您的预期结果不是有效的 json 表达式。您可能想要一个 json 数组:
{ "myObject": { "data": ["valueB", "ValueD"] } } -
您好安德里亚,感谢您的评论。我更新我的帖子。我不想要一个 json 数组,而是一个 json 值,它是一个逗号分隔的列表。我用它来设置一个 .net 标志枚举。
-
==不是有效的 T-SQL 语法,True也不是。即使我们理解您的意思,当您发布功能代码时,整个事情会更好。myLegacyTable到底是什么? -
JSON 是一种很好的消息格式,但不是存储关系数据的好选择。然后通过将多个属性填充到一个属性中来破坏 JSON 的规则,使情况变得更糟......无论如何,您的 JSON 中
data的值只是一个字符串。因此,只需使用 select 语句在 one 列中生成整个字符串。不要将它放在单独的列中,因为您的 JSON 只引用一个字符串。 -
当表格包含多于一行时,预期的输出是什么?
标签: sql json sql-server tsql database-migration