这个
@output =
SELECT
A["Value"] ?? "0" AS CAST ### (("System_" + A["Name"]) AS STRING),
B["Value"] ?? "0" AS "System_" + B["Name"],
System_da
不是一个有效的 SELECT 子句(在 U-SQL 和我所知道的任何其他 SQL 方言中都不是)。
什么是 JSON 数组?它是键/值对吗?还是定位?还是数组中的单个值,您想要标记它是否存在于数组中?
从你的例子来看,你似乎想要这样的东西:
输入:
[["A","B","C"],["C","D","B"]]
输出:
A B C D
true true true false
false true true true
如果是这样的话,我会写成:
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
USING Microsoft.Analytics.Samples.Formats.Json;
@input =
SELECT "[[\"A\", \"B\", \"C\"],[\"C\", \"D\", \"B\"]]" AS json
FROM (VALUES (1)) AS T(x);
@data =
SELECT JsonFunctions.JsonTuple(arrstring) AS a
FROM @input CROSS APPLY EXPLODE( JsonFunctions.JsonTuple(json).Values) AS T(arrstring);
@data =
SELECT a.Contains("A") AS A, a.Contains("B") AS B, a.Contains("C") AS C, a.Contains("D") AS D
FROM (SELECT a.Values AS a FROM @data) AS t;
OUTPUT @data
TO "/output/data.csv"
USING Outputters.Csv(outputHeader : true);
如果您需要更动态的内容,请使用生成的 SqlArray 或 SqlMap 或使用上述方法生成脚本。
但是,我想知道您为什么首先要以这种方式建模您的信息。我建议找到一种更合适的方式来标记 JSON 中值的存在。
更新:我错过了您关于内部数组成员是具有两个键值对的对象的评论,其中一个始终称为名称(用于属性),一个始终称为值适当的价值。所以这就是那个案例的答案。
首先:使用{"Name": "propname", "Value" : "value"} 对 JSON 中的键值对进行建模完全滥用了 JSON 的灵活建模功能,不应这样做。如果可以,请改用{"propname" : "value"}。
因此更改输入,以下将为您提供枢轴值。请注意,您需要提前知道这些值,并且有几个关于如何进行数据透视的选项。我在创建新的SqlMap 实例以减少过度建模的语句中执行此操作,然后在下一个SELECT 中从地图中获取值。
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
USING Microsoft.Analytics.Samples.Formats.Json;
@input =
SELECT "[[{\"Name\":\"A\", \"Value\": 1}, {\"Name\": \"B\", \"Value\": 2}, {\"Name\": \"C\", \"Value\":3 }], [{\"Name\":\"C\", \"Value\": 4}, {\"Name\":\"D\", \"Value\": 5}, {\"Name\":\"B\", \"Value\": 6}]]" AS json
FROM (VALUES (1)) AS T(x);
@data =
SELECT JsonFunctions.JsonTuple(arrstring) AS a
FROM @input CROSS APPLY EXPLODE( JsonFunctions.JsonTuple(json)) AS T(rowid, arrstring);
@data =
SELECT new SqlMap<string, string>(
a.Values.Select((kvp) =>
new KeyValuePair<string, string>(
JsonFunctions.JsonTuple(kvp)["Name"]
, JsonFunctions.JsonTuple(kvp)["Value"])
)) AS kvp
FROM @data;
@data =
SELECT kvp["A"] AS A,
kvp["B"] AS B,
kvp["C"] AS C,
kvp["D"] AS D
FROM @data;
OUTPUT @data
TO "/output/data.csv"
USING Outputters.Csv(outputHeader : true);