Frage

In meiner Datenbank (SQL 2005) Ich habe ein Feld, das einen Kommentar hält aber im Kommentar Ich habe eine ID, und ich möchte nur die ID abzustreifen, und wenn möglich, wandeln es in ein int:

activation successful of id 1010101

Die Zeile oben ist die genaue Struktur der Daten in dem DB-Feld.

Und nein, ich will das nicht in dem Code der Anwendung tun, ich will eigentlich nicht, es zu berühren, falls Sie sich wundern; -)

War es hilfreich?

Lösung

Das sollte es tun:

SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999)
FROM table

Auf der Basis Ihrer Beispieldaten, dies, dass es nur ein Vorkommen einer ganze Zahl in der Zeichenfolge, und dass es am Ende.

Andere Tipps

Ich habe keine Mittel, um es im Moment zu testen, aber:

select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName

Sind Sie offen für ein Stück Code zu schreiben? Eine Möglichkeit, erstellen Sie eine CLR Benutzerdefinierte Funktion, dann Regex verwenden. Sie können weitere Informationen hier finden. Dies wird komplexe Strings verarbeiten.

Wenn Sie Ihre obige Zeile immer als ‚Aktivierung erfolgreich von id #######‘ formatiert ist, mit Ihrer Nummer am Ende des Feldes, dann:

declare @myColumn varchar(100)
set @myColumn = 'activation successful of id 1010102'


SELECT
    @myColumn as [OriginalColumn]
,   CONVERT(int, REVERSE(LEFT(REVERSE(@myColumn), CHARINDEX(' ', REVERSE(@myColumn))))) as [DesiredColumn]

geben Sie:

OriginalColumn                           DesiredColumn
---------------------------------------- -------------
activation successful of id 1010102      1010102

(1 row(s) affected)
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)
-- Test table, you will probably use some query  
DECLARE @testTable TABLE(comment VARCHAR(255))  
INSERT INTO @testTable(comment)  
    VALUES ('activation successful of id 1010101')

-- Use Charindex to find "id " then isolate the numeric part  
-- Finally check to make sure the number is numeric before converting  
SELECT CASE WHEN ISNUMERIC(JUSTNUMBER)=1 THEN CAST(JUSTNUMBER AS INTEGER) ELSE -1 END  
FROM (  
       select right(comment, len(comment) - charindex('id ', comment)-2) as justnumber  
       from @testtable) TT

Ich möchte auch hinzufügen, dass dieser Ansatz Satz basiert und daher effizienter für eine Reihe von Datenwerten. Aber es ist super einfach es für einen Wert als Variable nur zu tun. Statt die Spalte Kommentar verwenden Sie eine Variable wie @chvComment verwenden können.

Wenn der Kommentartext genau so ist, können Sie verwenden, ersetzen.

select   replace(comment_col, 'activation successful of id ', '') as id from ....

Es ist fast sicher nicht, obwohl sein - was nicht erfolgreich Aktivierungen? Sie könnten mit verschachtelten ersetzen Anweisungen end

select   replace(replace(comment_col, 'activation not successful of id ', ''), 'activation successful of id ', '') as id from ....

[leider nicht von diesem Bearbeitungsbildschirm sagen, ob das ist völlig gültigen SQL]

Das beginnt zu bekommen chaotisch; Sie sollten erwägen, eine Funktion zu schaffen und die in das ersetzen Aussagen setzen.

Wenn dies ein einmaliger ist Job, wird es nicht wirklich wichtig. Sie könnten auch einen regulären Ausdruck verwenden, aber das ist ziemlich langsam (und in jedem Fall bedeuten, Sie haben jetzt zwei Probleme).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top