2016-03-23 11 views
0

Erste Post hier. Was für eine großartige Ressource. Hoffe, jemand kann helfen ....SQL Server - Muster entspricht einer Zeichenfolge

Ich habe ein Zeichenfeld, das meist numerische Werte enthält, aber nicht alle. Das Feld, das wir diag nennen können, ist als varchar(8) formatiert. Es enthält Diagnosecodes und wurde zeitweise uneinheitlich eingegeben. So könnte ich 29001 im Feld diag sehen. Oder ich könnte 290.001 sehen. Manchmal werden die Leute es als 290.00 schreiben, andere Male 29000 und noch mal 290. Um es komplizierter zu machen, kann ich in diesem Feld Alpha-Zeichen haben, so dass das Feld etwas wie V700.00 oder H601 enthalten könnte. Wenn Sie diese Beispiele verwenden, ist dies jedoch ein Hinweis darauf, was in diesem Bereich vor sich geht.

Ich versuche eine Reihe von Werten zu finden .... zum Beispiel Diagnosecodes zwischen 29001 bis 29999. Unter Berücksichtigung der Inkonsistenzen im Coding-Eintrag möchte ich auch alle Datensätze zurückgeben, die einen diag Wert von 290.01 haben 299.99 Ich bin nur ratlos. Ich habe hier stundenlang gesucht und eine Menge Informationen gefunden ... aber ich konnte meine Frage nicht beantworten. Ich bin etwas neu in SQL und kann nicht herausfinden, wie Datensätze zurückgegeben werden, die dem Bereich der Werte entsprechen, die ich suche. Es gibt 40 Millionen Datensätze, also sind es viele Daten. Versuche es auf etwas zu reduzieren, mit dem ich arbeiten kann. Ich verwende eine ältere Version von SQL Server 2005, für den Fall, dass es darauf ankommt.

Jede Hilfe würde am meisten geschätzt werden. Ich weiß wirklich nicht, wo ich anfangen soll.

Vielen Dank!

Antwort

0

Mit diesem T-SQL können Sie alle nicht gewünschten Zeichen in Ihren Zahlen entfernen.

declare @strText varchar(50) 

--set @strText = '23,112' 
--set @strText = '23Ass112' 
set @strText = '2.3.1.1.2' 

WHILE PATINDEX('%[^0-9]%', @strText) > 0 
    BEGIN 
     SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '') 
    END 
    select @strText 

auf Ihrem Fall empfehle ich Ihnen eine Funktion

CREATE Function CleanNumbers(@strText VARCHAR(1000)) 
RETURNS VARCHAR(1000) 
AS 
WHILE PATINDEX('%[^0-9]%', @strText) > 0 
    BEGIN 
     SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '') 
    END 

return @strText 
END 

Dann erstellen Sie die Funktion, eine normale Abfrage Aufruf erstellen müssen.

WITH CTE as 
(
    SELECT dbo.CleanNumbers(yourtable.YourFakeNumber) as Number, yourtable.* 
    FROM yourtable 
    WHERE YourCriteria = 1 
) 
Select * from CTE where CAST(Number as int) between 29001 and 29999 

Oder einfacher

Select * from yourtable where CAST(dbo.CleanNumbers(YourFakeNumber) as int) between 29001 and 29999 

Ich hoffe, dass ich keine Rechtschreibfehler gemacht haben;)

+0

Licantropo ..... Ihre Methode hat perfekt funktioniert. Noch eine Frage an alle Ihre Experten. Ich brauche eine Änderung an der Lösung, mit der Sie mir hier geholfen haben. Zusätzlich zu dem, was Sie mir bereits gegeben haben, muss ich in der Lage sein, diejenigen Zeilen auszuschließen, bei denen die Variable diag mit irgendetwas außer einer Zahl beginnt. Mit anderen Worten, wenn das erste Zeichen ein Buchstabe im Alphabet ist, möchte ich es nicht in das einfügen, was ich zurückbringe. Vielen Dank für Ihre Hilfe !!! –

0

Es klingt wie Sie ein bisschen ein Chaos haben. Wenn Sie die Regeln für die Varianzen kennen, können Sie ein automatisiertes Skript zum Aktualisieren erstellen. Aber es klingt, als ob es ziemlich locker ist, also möchten Sie vielleicht damit beginnen, zu entscheiden, welche Werte für die Felder gültig sind, eine Tabelle erstellen, gegen die validiert werden soll, und dann die ungültigen Daten identifizieren und klassifizieren.

Im ersten Schritt müssen Sie eine Liste der gültigen Diagnosecodes erhalten und diese in eine Tabelle eintragen. Etwas wie:

CREATE TABLE [dbo].[DiagnosticCodes](
    [DiagnosticCode] [varchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [DiagnosticDescription] [varchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
CONSTRAINT [PK_DiagnosticCodes] PRIMARY KEY CLUSTERED 
    (
     [DiagnosticCode] ASC 
    ) 
) 

Dann erhalten Sie eine Liste der gültigen Codes und importieren Sie sie in diese Tabelle.

Dann müssen Sie Daten in Ihrer Tabelle finden, die ungültig ist. So etwas wie diese Abfrage erhalten Sie alle die ungültigen Codes in der Datenbank:

CREATE TABLE [dbo].[DiagnosticCodesMapping](
    [Diag] [varchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [NewCode] [varchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
CONSTRAINT [PK_DiagnosticCodesMapping] PRIMARY KEY CLUSTERED 
    (
     [Diag] ASC 
    ) 
) 

insert into [dbo].[DiagnosticCodesMapping] 
Select distinct MyDataTable.Diag, null NewCode 
from MyDataTable 
left join DiagnosticCodes 
on MyDataTable.Diag = DiagnosticCodes.DiagnosticCode 
where DiagnosticCodes.DiagnosticCode is null 

Dies erzeugt eine Tabelle aller ungültigen Codes und enthält auch ein Feld namens NewCode, mit dem Sie eine Abbildung aus dem ungültigen Code bevölkern werden ein neuer gültiger Code Hoffentlich wird diese Liste nicht lächerlich lang sein.Dann übergeben Sie es jemandem zur Überprüfung und geben das Feld NewCode als einen der gültigen Codes ein. Sobald Sie Ihre DiagnosticCodesMapping Tabelle vollständig ausgefüllt haben, können Sie ein Update tun, um alle Ihre Felder zu erhalten gültigen Gutscheincodes zu haben:

update MyDataTable 
set Diag=NewCode 
from MyDataTable 
join DiagnosticCodesMapping 
where MyDataTable.Diag = DiagnosticCodesMapping.Diag 

es auf diese Weise tun hat zudem den Vorteil, dass Sie jetzt beginnen können alle Dateneingabe Validieren in der Zukunft und du wirst diese Reinigung nie wieder machen müssen. Sie können eine Einschränkung erstellen, die sicherstellt, dass nur gültige Codes aus der Tabelle DiagnosticCode in das Feld Diag Ihrer Datentabelle eingegeben werden können. Sie sollten Ihre Schnittstelle überprüfen, um die neue Nachschlagetabelle ebenfalls zu verwenden. Sie müssen außerdem eine Datenverwaltungsschnittstelle für die Tabelle DiagnosticCode erstellen, wenn Sie über Superuser verfügen müssen, die neue Codes hinzufügen können.

Verwandte Themen