2016-11-11 4 views
2

Ich habe eine Tabelle mit einer Spalte namens Days. In der Spalte Days wird eine durch Kommas getrennte Zeichenfolge gespeichert, die die Wochentage darstellt. Zum Beispiel würde der Wert 1,2Sunday, Monday darstellen. Anstatt diese Informationen als kommagetrennte Zeichenfolge zu speichern, möchte ich sie in JSON konvertieren und in einer Spalte namens Frequency in derselben Tabelle speichern. Zum Beispiel wird ein Datensatz mit dem Days Wert von 1,2 sollte folgenden speichern aktualisiert wird in er Frequency Spalte ist:Aktualisieren der Datenbankspalte mit einer Zeichenfolge basierend auf dem Wert einer anderen Spalte

'{"weekly":"interval":1,"Sunday":true,"Monday":true,"Tuesday":false,"Wednesday":false,"Thursday":false,"Friday":false,"Saturday":false}}' 

ich einen Weg gefunden, dies mit einem Fall Aussage zu tun, unter der Annahme, dass es nur eine Ziffer in dem ist Days Spalte wie folgt:

UPDATE SCH_ITM 
SET 
    FREQUENCY = 
     CASE 
     WHEN SCH_ITM.DAYS = 1 THEN '{"weekly":{"interval":1,"Sunday":true,"Monday":false,"Tuesday":false,"Wednesday":false,"Thursday":false,"Friday":false,"Saturday":false}}' 
     WHEN SCH_ITM.DAYS = 2 THEN '{"weekly":{"interval":1,"Sunday":false,"Monday":true,"Tuesday":false,"Wednesday":false,"Thursday":false,"Friday":false,"Saturday":false}}' 
     WHEN SCH_ITM.DAYS = 3 THEN '{"weekly":{"interval":1,"Sunday":false,"Monday":false,"Tuesday":true,"Wednesday":false,"Thursday":false,"Friday":false,"Saturday":false}}' 
     WHEN SCH_ITM.DAYS = 4 THEN '{"weekly":{"interval":1,"Sunday":false,"Monday":false,"Tuesday":false,"Wednesday":true,"Thursday":false,"Friday":false,"Saturday":false}}' 
     WHEN SCH_ITM.DAYS = 5 THEN '{"weekly":{"interval":1,"Sunday":false,"Monday":false,"Tuesday":false,"Wednesday":false,"Thursday":true,"Friday":false,"Saturday":false}}' 
     WHEN SCH_ITM.DAYS = 6 THEN '{"weekly":{"interval":1,"Sunday":false,"Monday":false,"Tuesday":false,"Wednesday":false,"Thursday":false,"Friday":true,"Saturday":false}}' 
     WHEN SCH_ITM.DAYS = 7 THEN '{"weekly":{"interval":1,"Sunday":false,"Monday":false,"Tuesday":false,"Wednesday":false,"Thursday":false,"Friday":false,"Saturday":true}}' 
     END 
WHERE SCH_TYPE = 'W'; 

jedoch habe ich keine effecient Weg scheinen, um herauszufinden, zu handhaben einen Wert wie 1,5 in die richtige JSON Darstellung umgewandelt werden. Natürlich könnte ich jede mögliche Permutation aufschreiben, aber sicher ist ein besserer Weg?

+0

Ich habe keine Antwort für Sie, aber ich frage mich, warum Sie DATEPART() nicht verwenden und die Spalte alle zusammen vermeiden. Vielleicht hast du keine Datumsspalte, aber ich habe mich nur gefragt. – scsimon

Antwort

1

Okay, das wird dir geben Was hast du gefragt

create table test (days varchar(20), frequency varchar(500)) 

insert into test(days) values('1'),('2'),('3'),('4'),('5'),('6'),('7'),('1,5') 

update test set frequency = '{"weekly":{"interval":1,' 
    + '"Sunday": ' + case when days like '%1%' then 'true' else 'false' end + ',' 
    + '"Monday": ' + case when days like '%2%' then 'true' else 'false' end + ',' 
    + '"Tuesday": ' + case when days like '%3%' then 'true' else 'false' end + ',' 
    + '"Wednesday": ' + case when days like '%4%' then 'true' else 'false' end + ',' 
    + '"Thursday": ' + case when days like '%5%' then 'true' else 'false' end + ',' 
    + '"Friday": ' + case when days like '%6%' then 'true' else 'false' end + ',' 
    + '"Saturday": ' + case when days like '%7%' then 'true' else 'false' end + '}}' 

select * from test 

Obwohl natürlich z.B. Days = '1234' ergibt dasselbe wie '1,2,3,4' - genau wie 'Bl4arg3le12'. Wenn Days eine Zeichenfolge ist, können Sie "8" eingeben, was bedeutungslos ist?

Wirklich es klingt wie Sie eine zusätzliche Tabelle oder zwei brauchen:

Wenn „MyTable“ ist die Tabelle mit der Spalte Tage, fügen Sie einen Tag Tabelle mit den Tagen der Woche, dann ein MyTableDays Tabelle MyTable verlinken Einträge in Tage - für das 1,5 Beispiel gäbe es zwei Zeilen in MyTableDays

1

Mit Hilfe eines Parse-Funktion und einem Quer gelten

;with cteDays As (Select ID,Name From (Values(1,'Sunday'),(2,'Monday'),(3,'Tuesday'),(4,'Wednesday'),(5,'Thursday'),(6,'Friday'),(7,'Saturday')) D(ID,Name)) 

Update YourTable Set Frequency = '{"weekly":"interval":1,'+String+'}}' 
From YourTable A 
Cross Apply (
       Select String = Stuff((Select ','+String 
       From (
        Select String='"'+Name+'":'+case when RetVal is null then 'false' else 'true' end 
        From [dbo].[udf-Str-Parse](A.Days,',') A 
        Right Join cteDays B on RetVal=ID) N 
       For XML Path ('')),1,1,'') 
      ) B 

Select * from YourTable 

aktualisiert Tabelle

Days Frequency 
1,2  {"weekly":"interval":1,"Sunday":true,"Monday":true,"Tuesday":false,"Wednesday":false,"Thursday":false,"Friday":false,"Saturday":false}} 
1,2,3 {"weekly":"interval":1,"Sunday":true,"Monday":true,"Tuesday":true,"Wednesday":false,"Thursday":false,"Friday":false,"Saturday":false}} 

Die UDF benötigt, wenn

CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>'+ Replace(@String,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ') 
Verwandte Themen