it-swarm.com.de

Besserer Ansatz für "LIKE OR LIKE, OR LIKE, OR LIKE, OR) = WIE "

In dieser Frage er hat das gleiche Problem wie ich. Ich brauche so etwas wie:

select * from blablabla 
where product 
like '%rock%' or
like '%paper%' or
like '%scisor%' or
like '%car%' or
like '%pasta%' 

Dies ist hässlich und verwendet keine Indizes. In diesem Fall ist dies wirklich die einzige Möglichkeit, dies zu tun (um mehrere Wörter innerhalb einer Zeichenfolge auszuwählen), oder sollte ich FULLTEXT verwenden?

Soweit ich weiß, kann ich mit Volltext mehrere Wörter innerhalb einer Zeichenfolge auswählen.

Diese Frage spricht auch über Volltext

10
Racer SQL

Volltextindizes sind im Allgemeinen kein Wundermittel und erfordern zusätzliche Wartung, Speicherplatz und ziemlich aufdringliche Änderungen an Abfragemustern.

Wenn Sie nicht wirklich große Dokumente indizieren müssen (denken Sie an E-Mail-Textkörper, PDFs, Word-Dokumente usw.), sind sie übertrieben (und wenn wir ehrlich sind, würde ich diesen Prozess vollständig und vollständig aus SQL Server entfernen benutze Elasticsearch oder ähnliches).

Für kleinere Anwendungsfälle sind berechnete Spalten im Allgemeinen ein besserer Ansatz.

Hier ist eine kurze Demo-Einrichtung:

use tempdb

CREATE TABLE #fulltextindexesarestupid (Id INT PRIMARY KEY CLUSTERED, StopAbusingFeatures VARCHAR(100))

INSERT #fulltextindexesarestupid (Id)
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY (@@ROWCOUNT))
FROM sys.messages AS m
CROSS JOIN sys.messages AS m2

UPDATE #fulltextindexesarestupid
SET StopAbusingFeatures = CASE WHEN Id % 15 = 0 THEN 'Bad'
                               WHEN Id % 3 = 0 THEN 'Idea'
                               WHEN Id % 5 = 0 THEN 'Jeans'
                               END


ALTER TABLE #fulltextindexesarestupid 
ADD LessBad AS CONVERT(BIT, CASE WHEN StopAbusingFeatures LIKE '%Bad%' THEN 1
                    WHEN StopAbusingFeatures LIKE '%Idea%' THEN 1
                    ELSE 0 END)

CREATE UNIQUE NONCLUSTERED INDEX ix_whatever ON #fulltextindexesarestupid (LessBad, Id)

Abfragen, die sogar auf einer nicht persistenten Spalte basieren, geben uns einen Plan, der 'Indizes' und alles verwendet :)

SELECT COUNT(*)
FROM #fulltextindexesarestupid AS f
WHERE LessBad = 1

(NUTS

17
Erik Darling