问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sql 处理 json

发布网友 发布时间:2022-05-02 03:05

我来回答

3个回答

懂视网 时间:2022-05-02 07:26

创建方法 : 

 

/****** Object: UserDefinedFunction [dbo].[parseJSON] Script Date: 2017/7/11 18:27:28 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[parseJSON]( @JSON NVARCHAR(MAX))
	RETURNS @hierarchy TABLE
	 (
	 element_id INT IDENTITY(1, 1) NOT NULL, /* internal surrogate primary key gives the order of parsing and the list order */
	 sequenceNo [int] NULL, /* the place in the sequence for the element */
	 parent_ID INT,/* if the element has a parent then it is in this column. The document is the ultimate parent, so you can get the structure from recursing from the document */
	 Object_ID INT,/* each list or object has an object id. This ties all elements to a parent. Lists are treated as objects here */
	 NAME NVARCHAR(2000),/* the name of the object */
	 StringValue NVARCHAR(MAX) NOT NULL,/*the string representation of the value of the element. */
	 ValueType VARCHAR(10) NOT null /* the declared type of the value represented as a string in StringValue*/
	 )
	AS
	BEGIN
	 DECLARE
	 @FirstObject INT, --the index of the first open bracket found in the JSON string
	 @OpenDelimiter INT,--the index of the next open bracket found in the JSON string
	 @NextOpenDelimiter INT,--the index of subsequent open bracket found in the JSON string
	 @NextCloseDelimiter INT,--the index of subsequent close bracket found in the JSON string
	 @Type NVARCHAR(10),--whether it denotes an object or an array
	 @NextCloseDelimiterChar CHAR(1),--either a ‘}‘ or a ‘]‘
	 @Contents NVARCHAR(MAX), --the unparsed contents of the bracketed expression
	 @Start INT, --index of the start of the token that you are parsing
	 @end INT,--index of the end of the token that you are parsing
	 @param INT,--the parameter at the end of the next Object/Array token
	 @EndOfName INT,--the index of the start of the parameter at end of Object/Array token
	 @token NVARCHAR(200),--either a string or object
	 @value NVARCHAR(MAX), -- the value as a string
	 @SequenceNo int, -- the sequence number within a list
	 @name NVARCHAR(200), --the name as a string
	 @parent_ID INT,--the next parent ID to allocate
	 @lenJSON INT,--the current length of the JSON String
	 @characters NCHAR(36),--used to convert hex to decimal
	 @result BIGINT,--the value of the hex symbol being parsed
	 @index SMALLINT,--used for parsing the hex value
	 @Escape INT --the index of the next escape character
	 
	 DECLARE @Strings TABLE /* in this temporary table we keep all strings, even the names of the elements, since they are ‘escaped‘ in a different way, and may contain, unescaped, brackets denoting objects or lists. These are replaced in the JSON string by tokens representing the string */
	 (
	 String_ID INT IDENTITY(1, 1),
	 StringValue NVARCHAR(MAX)
	 )
	 SELECT--initialise the characters to convert hex to ascii
	 @characters=‘0123456789abcdefghijklmnopqrstuvwxyz‘,
	 @SequenceNo=0, --set the sequence no. to something sensible.
	 /* firstly we process all strings. This is done because [{} and ] aren‘t escaped in strings, which complicates an iterative parse. */
	 @parent_ID=0;
	 WHILE 1=1 --forever until there is nothing more to do
	 BEGIN
	 SELECT
	 @start=PATINDEX(‘%[^a-zA-Z]["]%‘, @json collate SQL_Latin1_General_CP850_Bin);--next delimited string
	 IF @start=0 BREAK --no more so drop through the WHILE loop
	 IF SUBSTRING(@json, @start+1, 1)=‘"‘ 
	 BEGIN --Delimited Name
	  SET @start=@Start+1;
	  SET @end=PATINDEX(‘%[^]["]%‘, RIGHT(@json, LEN(@json+‘|‘)-@start) collate SQL_Latin1_General_CP850_Bin);
	 END
	 IF @end=0 --no end delimiter to last string
	 BREAK --no more
	 SELECT @token=SUBSTRING(@json, @start+1, @end-1)
	 --now put in the escaped control characters
	 SELECT @token=REPLACE(@token, FROMString, TOString)
	 FROM
	 (SELECT
	  ‘"‘ AS FromString, ‘"‘ AS ToString
	  UNION ALL SELECT ‘\‘, ‘‘
	  UNION ALL SELECT ‘/‘, ‘/‘
	  UNION ALL SELECT ‘‘, CHAR(08)
	  UNION ALL SELECT ‘f‘, CHAR(12)
	  UNION ALL SELECT ‘
‘, CHAR(10)
	  UNION ALL SELECT ‘
‘, CHAR(13)
	  UNION ALL SELECT ‘	‘, CHAR(09)
	 ) substitutions
	 SELECT @result=0, @escape=1
	 --Begin to take out any hex escape codes
	 WHILE @escape>0
	 BEGIN
	  SELECT @index=0,
	  --find the next hex escape sequence
	  @escape=PATINDEX(‘%x[0-9a-f][0-9a-f][0-9a-f][0-9a-f]%‘, @token collate SQL_Latin1_General_CP850_Bin)
	  IF @escape>0 --if there is one
	  BEGIN
	  WHILE @index<4 --there are always four digits to a x sequence 
	  BEGIN
	   SELECT --determine its value
	   @result=@result+POWER(16, @index)
	   *(CHARINDEX(SUBSTRING(@token, @escape+2+3-@index, 1),
	    @characters)-1), @index=@index+1 ;
	  
	  END
	  -- and replace the hex sequence by its unicode value
	  SELECT @token=STUFF(@token, @escape, 6, NCHAR(@result))
	  END
	 END
	 --now store the string away 
	 INSERT INTO @Strings (StringValue) SELECT @token
	 -- and replace the string with a token
	 SELECT @JSON=STUFF(@json, @start, @end+1,
	   ‘@string‘+CONVERT(NVARCHAR(5), @@identity))
	 END
	 -- all strings are now removed. Now we find the first leaf. 
	 WHILE 1=1 --forever until there is nothing more to do
	 BEGIN
	 
	 SELECT @parent_ID=@parent_ID+1
	 --find the first object or list by looking for the open bracket
	 SELECT @FirstObject=PATINDEX(‘%[{[[]%‘, @json collate SQL_Latin1_General_CP850_Bin)--object or array
	 IF @FirstObject = 0 BREAK
	 IF (SUBSTRING(@json, @FirstObject, 1)=‘{‘) 
	 SELECT @NextCloseDelimiterChar=‘}‘, @type=‘object‘
	 ELSE 
	 SELECT @NextCloseDelimiterChar=‘]‘, @type=‘array‘
	 SELECT @OpenDelimiter=@firstObject
	 WHILE 1=1 --find the innermost object or list...
	 BEGIN
	 SELECT
	 @lenJSON=LEN(@JSON+‘|‘)-1
	 --find the matching close-delimiter proceeding after the open-delimiter
	 SELECT
	 @NextCloseDelimiter=CHARINDEX(@NextCloseDelimiterChar, @json,
	     @OpenDelimiter+1)
	 --is there an intervening open-delimiter of either type
	 SELECT @NextOpenDelimiter=PATINDEX(‘%[{[[]%‘,
	  RIGHT(@json, @lenJSON-@OpenDelimiter)collate SQL_Latin1_General_CP850_Bin)--object
	 IF @NextOpenDelimiter=0 
	 BREAK
	 SELECT @NextOpenDelimiter=@NextOpenDelimiter+@OpenDelimiter
	 IF @NextCloseDelimiter<@NextOpenDelimiter 
	 BREAK
	 IF SUBSTRING(@json, @NextOpenDelimiter, 1)=‘{‘ 
	 SELECT @NextCloseDelimiterChar=‘}‘, @type=‘object‘
	 ELSE 
	 SELECT @NextCloseDelimiterChar=‘]‘, @type=‘array‘
	 SELECT @OpenDelimiter=@NextOpenDelimiter
	 END
	 ---and parse out the list or name/value pairs
	 SELECT
	 @contents=SUBSTRING(@json, @OpenDelimiter+1,
	   @NextCloseDelimiter-@OpenDelimiter-1)
	 SELECT
	 @JSON=STUFF(@json, @OpenDelimiter,
	  @NextCloseDelimiter-@OpenDelimiter+1,
	  ‘@‘+@type+CONVERT(NVARCHAR(5), @parent_ID))
	 WHILE (PATINDEX(‘%[A-Za-z0-9@+.e]%‘, @contents collate SQL_Latin1_General_CP850_Bin))<>0 
	 BEGIN
	 IF @Type=‘Object‘ --it will be a 0-n list containing a string followed by a string, number,boolean, or null
	 BEGIN
	  SELECT
	  @SequenceNo=0,@end=CHARINDEX(‘:‘, ‘ ‘+@contents)--if there is anything, it will be a string-based name.
	  SELECT @start=PATINDEX(‘%[^A-Za-z@][@]%‘, ‘ ‘+@contents collate SQL_Latin1_General_CP850_Bin)--AAAAAAAA
	  SELECT @token=SUBSTRING(‘ ‘+@contents, @start+1, @End-@Start-1),
	  @endofname=PATINDEX(‘%[0-9]%‘, @token collate SQL_Latin1_General_CP850_Bin),
	  @param=RIGHT(@token, LEN(@token)-@endofname+1)
	  SELECT
	  @token=LEFT(@token, @endofname-1),
	  @Contents=RIGHT(‘ ‘+@contents, LEN(‘ ‘+@contents+‘|‘)-@end-1)
	  SELECT @name=stringvalue FROM @strings
	  WHERE string_id=@param --fetch the name
	 END
	 ELSE 
	 SELECT @Name=null,@SequenceNo=@SequenceNo+1 
	 SELECT
	 @end=CHARINDEX(‘,‘, @contents)-- a string-token, object-token, list-token, number,boolean, or null
	 IF @end=0 
	 SELECT @end=PATINDEX(‘%[A-Za-z0-9@+.e][^A-Za-z0-9@+.e]%‘, @Contents+‘ ‘ collate SQL_Latin1_General_CP850_Bin)
	  +1
	 SELECT
	 @start=PATINDEX(‘%[^A-Za-z0-9@+.e][A-Za-z0-9@+.e]%‘, ‘ ‘+@contents collate SQL_Latin1_General_CP850_Bin)
	 --select @start,@end, LEN(@contents+‘|‘), @contents 
	 SELECT
	 @Value=RTRIM(SUBSTRING(@contents, @start, @End-@Start)),
	 @Contents=RIGHT(@contents+‘ ‘, LEN(@contents+‘|‘)-@end)
	 IF SUBSTRING(@value, 1, 7)=‘@object‘ 
	 INSERT INTO @hierarchy
	  (NAME, SequenceNo, parent_ID, StringValue, Object_ID, ValueType)
	  SELECT @name, @SequenceNo, @parent_ID, SUBSTRING(@value, 8, 5),
	  SUBSTRING(@value, 8, 5), ‘object‘ 
	 ELSE 
	 IF SUBSTRING(@value, 1, 6)=‘@array‘ 
	  INSERT INTO @hierarchy
	  (NAME, SequenceNo, parent_ID, StringValue, Object_ID, ValueType)
	  SELECT @name, @SequenceNo, @parent_ID, SUBSTRING(@value, 7, 5),
	  SUBSTRING(@value, 7, 5), ‘array‘ 
	 ELSE 
	  IF SUBSTRING(@value, 1, 7)=‘@string‘ 
	  INSERT INTO @hierarchy
	  (NAME, SequenceNo, parent_ID, StringValue, ValueType)
	  SELECT @name, @SequenceNo, @parent_ID, stringvalue, ‘string‘
	  FROM @strings
	  WHERE string_id=SUBSTRING(@value, 8, 5)
	  ELSE 
	  IF @value IN (‘true‘, ‘false‘) 
	  INSERT INTO @hierarchy
	  (NAME, SequenceNo, parent_ID, StringValue, ValueType)
	  SELECT @name, @SequenceNo, @parent_ID, @value, ‘boolean‘
	  ELSE
	  IF @value=‘null‘ 
	  INSERT INTO @hierarchy
	   (NAME, SequenceNo, parent_ID, StringValue, ValueType)
	   SELECT @name, @SequenceNo, @parent_ID, @value, ‘null‘
	  ELSE
	  IF PATINDEX(‘%[^0-9]%‘, @value collate SQL_Latin1_General_CP850_Bin)>0 
	   INSERT INTO @hierarchy
	   (NAME, SequenceNo, parent_ID, StringValue, ValueType)
	   SELECT @name, @SequenceNo, @parent_ID, @value, ‘real‘
	  ELSE
	   INSERT INTO @hierarchy
	   (NAME, SequenceNo, parent_ID, StringValue, ValueType)
	   SELECT @name, @SequenceNo, @parent_ID, @value, ‘int‘
	 if @Contents=‘ ‘ Select @SequenceNo=0
	 END
	 END
	INSERT INTO @hierarchy (NAME, SequenceNo, parent_ID, StringValue, Object_ID, ValueType)
	 SELECT ‘-‘,1, NULL, ‘‘, @parent_id-1, @type
	--
	 RETURN
	END

GO

  执行语句:

select * from master.dbo. parseJSON( ‘
{
			"cityID":"408",
			"cityName":"香港特别行政区",
			"proID":"35",
			"value":"1",
			"area":"8",
			"pinyin":"xianggang",
			"enter":null,
			"hits":"24"
		}
‘
) 

  

sql转JSON为表

标签:unp   hit   oms   hits   process   list   int   ace   tab   

热心网友 时间:2022-05-02 04:34

json的数据json.loads进来以后会变成一个json的对象,你需要自己把python对象中的字段值取出来,拼成sql语句你可以把这个过程封装成一个函数importjsondefsave_json(json_str):obj=json.loads(json_str)sql='insertintotblvalues("%s")'%obj['id']#这里注意编码,要转成数据库的编码格式#blabla

热心网友 时间:2022-05-02 05:52

自己写个函数什么的来解析该字符串。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
不干胶印刷设备多少钱一套 小型不干胶印刷机价格 什么是走水运 水路的特点是什么 疯狂僵尸机游戏怎么玩,植物大战僵尸高清版怎么玩 植物大战僵尸2 植物大战僵尸2戴夫最好的朋友是谁? 怎么下载疯狂的戴夫游戏 游戏下载地址 小红书数据分析工具推荐 三分钟做好一张小红书封面,不同平台超好用的高效率工具你造吗_百度知... 网球王子的剧场版都有哪些啊 网球王子剧场版:英国式庭球城决战DVD情报 菠菜香菜零下两度至三度冻不死吧 菠菜和香菜冻了能吃吗 1000粒大米约重25克.照样计算,1亿粒大米大约重多少千克? 一亿粒大米有多重? 一亿粒大米有多少克? 小学生四年级数学题,估一估,1千克大米有多少粒 关于修改IP地址,不被限制网速的办法,请知识帝进来 一千粒大米多重? 公用同一IP地址,如何抢网速 一克大米大约有多少粒 一克大米大约有多少粒? 怎样改变IP?怎样提高网速? 我这件衣服衣摆卷起来了很难看,我想手工把它改成流苏的款式~但是我不知道该如何操作,请知道的亲教我一 流苏染色在衣服上怎么洗干净啊? 流苏缩水了怎么办? 衣服松紧带水洗之后会失去弹性,看起来很松很难看,应该怎么避免呢? 流苏的衣服洗了须须散开了 这种边角的衣服洗了之后卷起来了怎么弄回那种自然的感觉啊? 我衣服就是洗了一次,领子全部卷起来了。怎么恢复原样? 带流苏的衣服怎么清洗啊?以前有过类似的衣服,也是一样的流苏,洗完后就都坏了,全都脱丝了。 世界上最高的岛屿是什么 世界上海拔最高的岛屿是 世上海拔最高的岛屿 世界上最高的岛屿是什么地方 世界上最高海拔的岛屿 世界上最高的岛屿是哪个? 世界上最高的岛屿 世界最高岛屿? 世界上最高的岛屿? 世界上最高的岛屿,却隶属于两个国家,你知道是哪个吗? 题目二 人口密度最高的岛屿名称是什么?位于哪里 我国最大的岛屿是哪个岛? 我国最大的岛屿是那个岛? linux sqlplus执行sql文件 怎么转化为json 用java,统计txt文件中每个文字或者字母出现的次数,并由大到小排列,并显示每个文字或者字母出现的次数 ARCGIS 中newvalue为什么不能是小数 new_value=round(score[‘Chinese’])生么意思? newvalue swift是什么意思 请问您最后解决了ARCGIS重分类new value是小数的问题没? New Value has Set Successfully 是什么意思?