Zum Beispiel habe ich diese Aussage:
my name is Joseph and my father's name is Brian
Diese Anweisung wird von Word wie dieser Tabelle aufgeteilt:
------------------------------
| ID | Word |
------------------------------
| 1 | my |
| 2 | name |
| 3 | is |
| 4 | Joseph |
| 5 | and |
| 6 | my |
| 7 | father's |
| 8 | name |
| 9 | is |
| 10 | Brian |
------------------------------
Ich möchte das vorige und das nächste Wort jedes Wortes erhalten
Zum Beispiel möchte ich vorheriges und nächstes Wort von "Name" erhalten:
--------------------------
| my | name | is |
--------------------------
| father's | name | is |
--------------------------
Wie kann ich dieses Ergebnis erzielen?
sie haben Ihr DBMS nicht angegeben, also ANSI SQL:
select prev_Word, Word, next_Word
from (
select id,
lag(Word) over (order by id) as prev_Word,
Word,
lead(Word) over (order by id) as next_Word
from words
) as t
where Word = 'name';
SQLFiddle: http://sqlfiddle.com/#!12/7639e/1
Ohne Unterabfragen:
SELECT a.Word
FROM my_table AS a
JOIN my_table AS b
ON b.Word = 'name' AND abs(a.id - b.id) <= 1
ORDER BY a.id
Warum hat niemand die einfache Antwort gegeben?
SELECT LAG(Word) OVER ( ORDER BY ID ) AS PreviousWord ,
Word ,
LEAD(Word) OVER ( ORDER BY ID ) AS NextWord
FROM words;
Verwenden Sie Join
, um das erwartete Ergebnis für SQL Server 2005
plus zu erhalten.
create table words (id integer, Word varchar(20));
insert into words
values
(1 ,'my'),
(2 ,'name'),
(3 ,'is'),
(4 ,'joseph'),
(5 ,'and'),
(6 ,'my'),
(7 ,'father'),
(8 ,'name'),
(9 ,'is'),
(10,'brian');
SELECT A.Id , C.Word AS PrevName ,
A.Word AS CurName ,
B.Word AS NxtName
FROM words AS A
LEFT JOIN words AS B ON A.Id = B.Id - 1
LEFT JOIN words AS C ON A.Id = C.Id + 1
WHERE A.Word = 'name'
Ergebnis:
Versuche dies
SELECT *
FROM tablename a
WHERE ID IN(SELECT ID - 1
FROM tablename
WHERE Word = 'name') -- will fetch previous rows of Word `name`
OR ID IN(SELECT ID + 1
FROM tablename
WHERE Word = 'name') -- will fetch next rows of Word `name`
OR Word = 'name' -- to fetch the rows where Word = `name`
Hier ist ein anderer Ansatz, wenn Sie möchten, dass die Auswahl schnell ist. Es erfordert etwas Vorarbeit.
Erstellen Sie in der Datenbank eine neue Spalte (z. B. "Phrase"), die die gewünschten Wörter enthält. (d. h. der vorherige, der aktuelle und der nächste).
Schreiben Sie einen Auslöser, der beim Einfügen das neue Word an die vorherige Zeile der Zeile Anhängt und das Word der vorherigen Zeile an das Word der neuen Zeile anfügt und die Phrase Füllt.
Wenn sich die einzelnen Wörter ändern können, benötigen Sie beim Update einen Auslöser, um die Phrase synchron zu halten.
Dann wählen Sie einfach die Phrase aus. Sie erhalten eine viel höhere Geschwindigkeit, jedoch auf Kosten zusätzlicher Lagerung, langsamerer Einfügung und härterer Wartbarkeit. Offensichtlich müssen Sie die Phrasenspalte für die vorhandenen Datensätze aktualisieren, aber Sie haben die SQL, um dies in den anderen Antworten zu tun.