2009-04-15 8 views
0

Ich habe eine Tabelle mit varchar (128) Spalte mit Daten invertieren wie:Wie Wörter in einer Spalte

word1, word2, word3, Word4
word1, word2, word3,
word1 ,, ,,; word2
; word1 word2, word3

Ich habe diese Tabelle zu aktualisieren, so dass Wörter umgekehrter Reihenfolge:

Word4, word3, word2, word1
,, word3, word2, word1

Könnten Sie mir helfen, es mit nur einer einzigen SQL-Abfrage zu tun?

+0

Sie die Kommas und Semikolons eine Rolle? – Quassnoi

+0

Diese Frage könnte eine Klarstellung erfordern. – Jeremiah

+0

Was trennt die Wörter? Raum? Komma? Semikolon? – fredrik

Antwort

1

Die beste Sache zu tun wäre, nie Daten auf diese Weise zu speichern. Wenn dies in einer verwandten Tabelle wäre, wie es sein sollte, dann könnten Sie nach Herzenslust bestellen. Persönlich wäre es wahrscheinlich am schnellsten, die Daten zumindest in eine temptable- oder Tabellenvariable zu teilen, die eine zusätzliche Identitätsspalte hat, und dann in der entsprechenden Reihenfolge in dieser Spalte zu sortieren.

0

Ich denke, Sie könnten eine neue Tabelle erstellen und in die Tabelle die Daten aus der ersten Tabelle einfügen.

INSERT INTO TABLE2 SELECT * FROM TABLE1 ORDER BY COLUMN1 DESC

Dann table2 fallen und Tabelle1 umbenennen.

Vielleicht ...

0

Dank für Ihre Antworten

Wörter getrennt durch Leerzeichen, Kommas und/oder Semikolons, alle Separatoren sollten

an ihrem Platz bleiben z Rekord

'word1, word2 ;;; word3,'

evalueates zu

'word3, word2 ;;; word1'

aufgrund Anforderungen des bestehenden Systems es getan werden muss, mit einzelner Abfrage,

ich habe versucht:

update t_desc set name = 
(select name 
from 
(select name, 
case when wb is null then rname when wb >= we then stuff(rname, wb, 128, REVERSE  (substring(rname, wb, 128))) else 
stuff(rname, wb, we-wb+1, REVERSE(substring(rname, wb, we-wb+1))) end rname, 
case when wb is null or wb > we then null else PATINDEX('%[a-z0-9]%', SUBSTRING(rname, we+1, 128))+we end wb, 
case when we is null or wb > we then null else PATINDEX('%[a-z0-9][^a-z0-9]%', SUBSTRING(rname, we+1, 128))+we end we 
from 
(select name, 
case when wb is null then rname when wb >= we then stuff(rname, wb, 128, REVERSE (substring(rname, wb, 128))) else 
stuff(rname, wb, we-wb+1, REVERSE(substring(rname, wb, we-wb+1))) end rname, 
case when wb is null or wb > we then null else PATINDEX('%[a-z0-9]%', SUBSTRING (rname, we+1, 128))+we end wb, 
case when we is null or wb > we then null else PATINDEX('%[a-z0-9][^a-z0-9]%',  SUBSTRING(rname, we+1, 128))+we end we 
from 
(select name, 
case when wb is null then rname when wb >= we then stuff(rname, wb, 128, REVERSE  (substring(rname, wb, 128))) else 
stuff(rname, wb, we-wb+1, REVERSE(substring(rname, wb, we-wb+1))) end rname, 
case when wb is null or wb > we then null else PATINDEX('%[a-z0-9]%', SUBSTRING  (rname, we+1, 128))+we end wb, 
case when we is null or wb > we then null else PATINDEX('%[a-z0-9][^a-z0-9]%',   SUBSTRING(rname, we+1, 128))+we end we 
from 
(select name, 
stuff(rname, wb, we-wb+1, REVERSE(substring(rname, wb, we-wb+1))) rname, 
PATINDEX('%[a-z0-9]%', SUBSTRING(rname, we+1, 128))+we wb, 
PATINDEX('%[a-z0-9][^a-z0-9]%', SUBSTRING(rname, we+1, 128))+we we 
from 
(select name, rname, 
PATINDEX('%[a-z0-9]%', rname) wb, 
PATINDEX('%[a-z0-9][^a-z0-9]%', rname) we 
    from 
(select t_desc.name, REVERSE(name) rname) t1) t2) t3) t4) t5) t6) 

und ähnliche Ideen, aber es wurde nicht richtig

bearbeiten arbeiten: alles außer Buchstaben und Ziffern sind Separatoren

edit2: unfortunetely kann ich nicht DDL-Anweisungen aufrufen, und ich habe keinen direkten Zugriff auf die Datenbank, Meine Firma verwendet alte, geschlossene Software - wir können nur die Konsole der äußeren Anwendung verwenden, um auszuwählen oder manchmal zu aktualisieren. Ich kann mein Update zur Jobliste hinzufügen - es wird jeden Tag in Zukunft ausgeführt.

Tabelle hat ca. 60k Zeilen, Spalte enthält zwischen 2 und etwa 20 Worten, nicht null

sorry für mein Englisch :)

0

ich einen Gedanken haben, da Sie zu einer Abfrage eingeschränkt sind. Können Sie eine UDF mit Tabellenwert erstellen, die dasselbe wie die von mir vorgeschlagene temporäre Tabelle tut? Treten Sie diesem bei und bestellen Sie desc. Es wird nicht performant (natürlich wird nichts sein, wenn die Struktur so schlecht entworfen ist), aber es könnte den Job machen, wenn Sie Millionen von Datensätzen haben.

Oder können Sie eine gespeicherte Proc und rufen Sie nur über Ihre GUI, die Sie mehrere Schritte haben können.

2

Um diese Aufgabe zu erfüllen, benötigen Sie eine t-sql-Funktion und einen Cursor. Mit fn_SplitList können Sie basierend auf einem Trennzeichen teilen. Sobald Sie diese Funktion haben, können Sie einen Cursor erstellen, der gegen Ihre Daten läuft und jeden Datensatz aktualisiert. Ich habe ein Beispiel mit @ table1 erstellt.

Funktion

CREATE FUNCTION [dbo].[fn_SplitList] 
(
    @RowData varchar(8000), 
    @SplitOn varchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data varchar(100) 
) 
AS 
BEGIN 
    Declare @Cnt int 
    Set @Cnt = 1 

    While (Charindex(@SplitOn,@RowData)>0) 
    Begin 
     Insert Into @RtnValue (data) 
     Select 
      Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) 

     Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) 
     Set @Cnt = @Cnt + 1 
    End 

    Insert Into @RtnValue (data) 
    Select Data = ltrim(rtrim(@RowData)) 

    Return 
END 

Code Update durchführen

declare @table1 table(id int primary key 
        ,words varchar(max)) 
declare @id int 
declare @words varchar(max) 

insert into @table1 values(0, 'word1, word2, , word3, word4') 
insert into @table1 values(1, 'word1, word2, word3, ,') 
insert into @table1 values(2, 'word1,,,, ; word2') 
insert into @table1 values(3, ';word1 word2, word3') 

declare updateCursor cursor for 
select id 
     ,words 
    from @table1 

open updateCursor 
fetch next from updateCursor into @id, @words 
while @@fetch_status = 0 
begin 
    declare @row varchar(255) 

    select @row = coalesce(@row+', ', '') + data 
    from dbo.fn_SplitList(@words, ',') 
    order by id desc 

    update @table1 
    set words = @row 
    where id = @id 

    fetch next from updateCursor into @id, @words 
end 
close updateCursor 
deallocate updateCursor 

select * 
    from @table1 
Verwandte Themen