ако имате нещо като:
text
result
measure
text
measure
result
text
result
text
measure
text
measure
result
text
measure
text
как може да извлечете всяка мярка и резултат между 2 текста, добре аз извлечени резултатите и мерките, които искам и ги съхранява в променливи, но какво мога да направя, когато имам:
text
measure
text
и бих искал да извлече резултата като NULL в този случай ....
Отговори:
1 за отговор № 1Ако изтегляте данни от текстов файл, тогаванай-добрият вариант е да настроите таблицата, в която импортирате, с поле за идентичност, така че докато я зареждате, на стойностите се присвоява номер по ред:
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");
Получената таблица ще изглежда така:
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
От там можем да намерим резултатите и мерките между текста.
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);
Първо, трябва да получим позициите на всеки текстов запис и следния текстов запис. След това можем да потърсим първия рекорд за резултати и записа на мярката в началото и в края.
Result Measure
result measure
result measure
result NULL
NULL measure
result measure
NULL measure