Submitted by Niels Liisberg on Tue, 01/28/2014 - 17:43
Forums

Der er kommet en fed ny feature i IceBreak, så man kan gemme JSON objekter i DB/2's varchar tabel kolonner. Det har vi brugt i et stykke tid, men nu er det altså en mere rigtig JSON parser, som behandler data hvilket har følgende fordele:

Hvis man f.eks har en table med følgende:

Screenshot1

Så kan man fiske enhver element ud af kolonnen SRCDTA med følgende udtryk. F.eks. Hvis vi henter "age":

     select   jsonGetStr(SRCDTA , 'age') as "age"  
     from props                                         

Hvilket giver:

Screenshot2

Det som er det sprit nye er, at vi kan dykke ned i et objekt – f.eks elementet "lang" og tage væredien af "da"

Dette gøres med en punktum notation altså "lang.da" 

     select  jsonGetStr(SRCDTA , 'lang.da')  as "Language"
     from props 

Screenshot3

Bemærk de tommer rækker – Det er fordi disse rækker ikke indeholder en værdi for  "lang.da"

Hvis man nu også vil have både dansk og engelsk ud – eller rettere hente hele objektet kan man bare bede om "lang" - der er jo et objekt,

     select  jsonGetStr(SRCDTA , 'lang')  as "Language" 
     from props                                    

så det giver:

Screenshot4

Og det er DET som er det fede – det virker også på arrays

     select  jsonGetStr(SRCDTA , 'a')  as "a-keys" 
     from props   

Screenshot5

Den samlede liste af funktioner 

(ser sådan her ud nu – men der kommer flere til)

Select numC('123,45')  
from props 

                      Konverter en streng til nummer hvor komma er decimal tegn

Select numD('123.45')  
from props

                      Konverter en streng til nummer hvor punktum  er decimal tegn

Select  jsonGetNum(SRCDTA , 'seq')  as "Seq" 
from props                                    

                      Hent en numerisk JSON element 

Select  jsonGetLongStr(SRCDTA , 'lang')  as "lang" 
from props                                    

                      Hent en varchar (16384) JSON element 

Select  jsonGetStr(SRCDTA , 'lang')  as "lang" 
from props                                    

                      Hent en varchar (256) JSON element 

Select  jsonGetShortStr(SRCDTA , 'lang')  as "lang" 
from props                                    

                      Hent en varchar (32) JSON element 

SELECT count(*)                                      
FROM   spareparts/WSHILGET00                         
where   jsonPropsIn
(ILGPROP, 'itemnumber,manuitemno' ,'04466-05040,04466-05040') = 1

                      Returnerere 1 hvis proterty listen indeholder en i listen. Begge liste indeholder er ikke  case-sensetive og adskilles  af komma

SELECT count(*)                                      
FROM   spareparts/WSHILGET00                         
where   jsonPropsLike
(ILGPROP, 'itemnumber,manuitemno' ,'04466') = 1

                      Returnerere 1 hvis proterty listen scannes for og indegolder én fra like feltet. Værdierne er ikke case-sensetive. Proteries adskilles af komma

SELECT count(*)                                      
FROM   spareparts/WSHILGET00                         
where   jsonPropsLikeIn
(ILGPROP, 'itemnumber,manuitemno' ,'04466,05040') = 1

                      Returnerere 1 hvis proterty listen scannes for og indeholder én fra listen. Begge lister indehold er ikke case-sensetive og adskilles  af komma ( Den er lidt kostbar … og suger lidt søm)

Select * from table (
  jsonAsTable(             
      '/www/portfolio/admin/resources/ns/webr.ns',  
      '/enums/month/values'   ,
      'da'
  )
) as s        
                      Ok den er ret syret, men hvis du skal benytte JSON data f.eks til join med alm. SQL tables, er den her ret fed: jsonAsTable er en funktion som læser en JSON file på IFS'en, og der exponerer data som var det en DB/2 tabel. F.eks er webr.ns en stor JSON file med en hulens masse tags. Der i blandt findes f.eks. Månedernes navne – og dem kan vi så trække ud på f.eks dansk med ovenstående….

Den har også en bror ( jsonAsTable2) som returnerer flere kolonner en bare key/values store.

Best Regards,

Niels Liisberg