2016-07-26 2 views
0

Ich habe eine Tabelle (Träger) Ich suche. Ich verwende LIKE, um die DB abzufragen. Ich frage zwei Spalten (cName, Code) in dieser einen Tabelle ab und überprüfe dann, ob sie aktiv ist. Wenn ja, gib das Ergebnis zurück. Mein Problem ist, dass wenn ich nach dem Code "ABCD" suche, bekomme ich nichts zurück (was korrekt ist, weil ABCD inaktiv ist. Wenn ich den Namen des Trägers von ABCD (American Bu ...) suche. Ich bekomme einen Datensatz zurück .? falsch ist Ursache der Kunde nicht aktiv ist) wie erzwinge ich sql mich nicht inaktive Träger zeigen Hier ist meine sql:. ​​Die Verwendung von LIKE für zwei verschiedene Spalten liefert keine gewünschten Ergebnisse

SELECT carrierID, cName, code 
FROM carriers 
WHERE 
    (
    cName LIKE '%" & replace(q,"'","''") & "%' 
    OR code LIKE '%" & replace(q,"'","''") & "%' 
) 
    AND active='True' 
+0

Ich glaube nicht, Ihre Verkettung wie das funktioniert; – techspider

+0

Ich benutze klassische asp und das ist wie Sie verketten. – Damien

+0

Sie müssen dynamic sql verwenden, wenn Sie Werte mit Ihrer LIKE-Bedingung – techspider

Antwort

1

Angenommen, Sie erstellen SQL auf dem Webserver oder Client.

Declare mySQL as String = "SELECT carrierID, cName, code FROM carriers WHERE CharIndex('[getSearch]',cName) + CharIndex('[getSearch]',code) > 0 and active='True'" 
mySQL = Replace(mySQL,"[getSearch]",replace(q,"'","''")) 

FYI ist CHARINDEX schneller als LIKE

+0

Ich weiß nicht, ob ich voll und ganz daran glaube [dieser einmalige Test, den ich gesehen habe] (http://cc.davelozinski.com/sql/like-vs-substring-vs-leftright-vs-charindex) wird in anderen Szenarien anwendbar sein. Für den Anfang machen die meisten Leute keine Dinge wie '' aClusteredIndexedColumn wie @WhatToLookFor + '%' oder 'aClusteredIndexedColumn' wie '%' + @WhatToLookFor) 'oder nur den Pufferpool usw. zu Beginn aller Tests löschen und dann ausführen der LIKE-Test zuerst (was bedeutet, dass er die Kosten für das Laden der Daten in den Pufferpool trägt). Auf den ersten Blick scheint der Test für mich etwas schräg zu sein. –

+0

@AaronBertrand Ich bezweifelte es auch, also habe ich eine Reihe von Tests auf 65MM Reihen durchgeführt. von Dateien. CharIndex war konstant schneller 50 - 120% schneller Dies ist der Beitrag, der meine Meinung geändert hat http://cc.davelozinski.com/sql/like-vs-substring-vs-leftright-vs-charindex –

+0

Ja, das ist der gleiche Link, den ich gesetzt habe in meinem Kommentar. Hast du andere veröffentlichte Beweise dafür? Noch einmal, die Tests in diesem speziellen Artikel scheinen nicht fair, und wenn Sie Ihre Tests basierend auf dem gleichen Framework ausgeführt ... –

0

ich unten für Ihre Abfrage ein Beispiel erstellt haben Solange Sie Werte liefern in dieses Format können Sie Ergebnisse erwarten. ich glaube, es ist etwas falsch mit Ihrer Verkettung ist. Sie können versuchen, sehen mit SQL Profiler um zu überprüfen, was Sie zu SQL Server senden.

CREATE TABLE carriers 
(
    carrierID INT 
    , cName  VARCHAR(50) 
    , code  VARCHAR(50) 
    , active VARCHAR(5) 
) 
GO 

INSERT INTO carriers VALUES (1, 'ABCD', 'XYZ', 'False') 
INSERT INTO carriers VALUES (2, 'test', 'abcd', 'False') 
INSERT INTO carriers VALUES (3, 'ABCD2', 'XYZ', 'True') 
INSERT INTO carriers VALUES (4, 'test2', 'abcd2', 'True') 

SELECT carrierID, cName, code 
FROM carriers 
WHERE 
    (
      cName LIKE '%ABCD%' 
      OR code LIKE '%ABCD%' 
    ) 
    AND active='True' 
+0

nichts falsch mit meiner Verkettung. Das ist eine dynamische SQL-Zeichenfolge. Der Code stammt von einer klassischen ASP-Seite. Ich hätte nur cName LIKE '% American B%' ODER Code LIKE '% American B%' UND Active = 'True' Damien

+0

Sie können mein Skript nehmen, fügen Sie Ihre Eingabedaten hinzu und lassen Sie uns nicht wissen, wo Ihre Abfrage fehlschlägt ... – techspider

Verwandte Themen