2017-03-29 3 views
0

Ich habe diese sql query:sql: Abfrage mit vielen Bedingungen optimieren

SELECT 
    [Id], 
    [Content]  
FROM 
    [MyTable] with (nolock) 
where 
    Content is not null 
    and (PATINDEX('%"number" : "[0-9]%', Content) > 0 
     or PATINDEX('%"number":"[0-9]%', Content) > 0 
     or PATINDEX('%"number" :"[0-9]%', Content) > 0 
     or PATINDEX('%"number": "[0-9]%', Content) > 0 
     --del 
     or PATINDEX('%"del":"[0-9]%', Content) > 0 
     or PATINDEX('%"del":"[0-9]%', Content) > 0 
     or PATINDEX('%"del":"[0-9]%', Content) > 0 
     or PATINDEX('%"del":"[0-9]%', Content) > 0 
) 

Auf meinem Server mit Caches gelöscht, dauert es länger als zwei Minuten um 400 Zeilen zurückgeben, vielleicht, weil ich habe eine Menge Bedingungen mit or.

Ich habe die Abfrage auf diese Weise wegen der Möglichkeiten der "Nummer" Zeichenfolge in der Content Spalte mit einem Leerzeichen oder nicht zwischen ":" und "Anzahl" Zeichenfolge oder die nächste Ziffer erstellt.

Gibt es eine Möglichkeit, von den or Bedingungen zu reduzieren?

+0

'REPLACE (‘ ' '') 'Leerraum entfernen kann dann eine einzelne' PATINDEX (' % "number": "[0 -9]% ''? –

+0

Hört sich an, als hätten Sie eine miese Datenstruktur. Vielleicht möchten Sie die Daten reparieren. –

+0

Es ist mir nicht erlaubt, ein Leerzeichen mit einer leeren Zeichenfolge zu ändern. Diese Daten stammen von den Clients, die eine API integriert haben kann das json so senden, wie es will, solange es gültig ist –

Antwort

1

Probieren Sie es

SELECT 
    [Id], 
    [Content]  
FROM 
    [MyTable] with (nolock) 
where 
    Content is not null 
    and (PATINDEX('%"number":"[0-9]%', replace(Content,' ','')) > 0 
     or PATINDEX('%"del":"[0-9]%', replace(Content,' ','')) > 0) 

und Sie Content is not null Teil auch

+0

Ich darf kein Leerzeichen mit einem leeren String ändern Diese Daten stammen von den Clients tha t integriert eine API und sie können die JSON senden, wie sie wollen, solange es gültig ist. –

+0

@BudaGavril: Der Vorschlag von Vecciassignora wird keine Änderungen an Ihren Daten vornehmen, es wird einfach nach allen Datensätzen gesucht, die mit dem 'PatIndex()' im Feld 'Kontext' übereinstimmen, wenn die Leerzeichen darin entfernt würden. Es ist wie sagen: WHERE Feld + 5 = 10; Dies würde Ihnen alle Datensätze zurückgeben, in denen "field" gleich 5 ist, aber es würde keine Änderungen an "field" vornehmen. – deroby