/ / patterns in sql - sql, sql-server-2008

modelli in sql - sql, sql-server-2008

se hai qualcosa del tipo:

text
result
measure
text
measure
result
text
result
text
measure
text
measure
result
text
measure
text

come hai potuto estrarre ogni misura e risultato tra 2 testi, ok ho estratto i risultati e le misure che voglio e li ho memorizzati in variabili ma cosa posso fare dove ho:

text
measure
text

e mi piacerebbe estrarre il risultato come NULL in questo caso ....

risposte:

1 per risposta № 1

Se stai prelevando dati da un file di testo, allorala tua migliore opzione è probabilmente quella di impostare la tabella che stai importando con un campo identità in modo tale che quando la carichi, i valori siano assegnati a un numero in ordine:

DECLARE @table TABLE
(RowNum INT IDENTITY
,val VARCHAR(36));

INSERT  INTO @table
VALUES  ("text"),
("result"),
("measure"),
("text"),
("measure"),
("result"),
("text"),
("result"),
("text"),
("measure"),
("text"),
("measure"),
("result"),
("text"),
("measure"),
("text");

La tabella risultante avrà quindi questo aspetto:

RowNum  val
1   text
2   result
3   measure
4   text
5   measure
6   result
7   text
8   result
9   text
10  measure
11  text
12  measure
13  result
14  text
15  measure
16  text

Da lì possiamo andare a trovare i risultati e le misure tra il testo.

SELECT  Results.Result
,Measures.Measure
FROM    ((
SELECT RowNum AS Start FROM @table WHERE val = "text"
) AS A
OUTER APPLY (
SELECT TOP 1 RowNum AS [End]
FROM      @table endTab
WHERE     val = "text"
AND A.Start < endTab.RowNum
ORDER BY RowNum
) AS B
OUTER APPLY (
SELECT TOP 1
val AS Result
FROM      @table resultTab
WHERE     val = "result"
AND resultTab.RowNum BETWEEN A.Start AND B.[End]
) AS Results
OUTER APPLY (
SELECT TOP 1
val AS Measure
FROM      @table measureTab
WHERE     val = "measure"
AND measureTab.RowNum BETWEEN A.Start AND B.[End]
) AS Measures);

Per prima cosa, dobbiamo ottenere le posizioni di ogni record di testo e il seguente record di testo. Quindi possiamo cercare il primo record di risultati e il record di misura entro l'inizio e la fine.

Result  Measure
result  measure
result  measure
result  NULL
NULL    measure
result  measure
NULL    measure