Nar*_*dra 1 sql t-sql sql-server pivot-table
在 T-Sql 中,我正在解析 JSON 并使用PIVOT.
Select * from (select [key],convert(varchar,[value])[value]
from openjson ('{"Name":"tew","TabTypeId":9,"Type":3}'))A
pivot(max(value) for [key] in ([Name],tabTypeId,[Type]))b
Run Code Online (Sandbox Code Playgroud)
它不被视为tabTypeId等于TabTypeId。我正在NULL为tabTypeId.
如果我使用TabTypeId我就会得到价值9。
为什么会发生这种情况?
它不PIVOT区分大小写,而是从中返回的数据OPENJSON。如果检查从它返回的数据,您将看到该列key是二进制排序规则:
SELECT name, system_type_name, collation_name
FROM sys.dm_exec_describe_first_result_set(N'SELECT [key], CONVERT(varchar, [value]) AS [value] FROM OPENJSON(''{"Name":"tew","TabTypeId":9,"Type":3}'');',NULL,NULL)
Run Code Online (Sandbox Code Playgroud)
| 姓名 | 系统类型名称 | 排序规则名称 |
|---|---|---|
| 钥匙 | nvarchar(4000) | Latin1_General_BIN2 |
| 价值 | varchar(30) | SQL_Latin1_General_CP1_CI_AS |
对于二进制排序规则,字符的实际字节必须匹配。因此N'tabTypeId'和N'TabTypeId'不等于和具有值和。N'T'N't'binary0x54000x7400
虽然我不确定你为什么要使用PIVOT;只需在调用中定义您的列OPENJSON:
SELECT name, --Columns are intentionally demonstrating non-case sensitivity
tabTypeId,
type
FROM OPENJSON('{"Name":"tew","TabTypeId":9,"Type":3}')
WITH (Name varchar(3),
TabTypeId int,
Type int);
Run Code Online (Sandbox Code Playgroud)
请注意,WITH子句中的OPENJSON列名仍然区分大小写。tabTypeId int也会产生NULL. 如果您“必须”在您之前有一个名为tabTypeIdDefined 的列,那么您将使用它。SELECTtabTypeId int '$.TabTypeId'