2011-12-07 7 views
20

Jestem całkiem nowy w SQL i próbowałem uzyskać pełną listę produktów, które pasują do danych wejściowych użytkownika identyfikatora produktu. Coś jak:Wykonywanie porównania LIKE na polu INT

SELECT ProductID, ProductName FROM Products WHERE ProductID LIKE '%15%' 

chciałbym go do listy wszystkie pasujące produkty takie jak: 15, 150, 2154, etc

niestety używam do problemów, ponieważ pole ProductId jest INT a nie ciąg. Czy jest jakiś względnie prosty sposób obejścia tego?

+1

Jeśli "poprawną" odpowiedzią jest konwersja/odrzucenie wartości do tekstu, wówczas tabela powinna zostać zmieniona, aby trwale przekształcić kolumnę w tekst. Jest to intuicyjne, ponieważ nie trzeba wykonywać matematyki na identyfikatorach produktów. – onedaywhen

Odpowiedz

29

Można CAST boiska ciąg:

... WHERE CAST(ProductID as CHAR) LIKE '%15%' 

to jest bardzo złe dla wydajności, jak MySQL nie mogą korzystać z żadnych indeksów Jest on tworzony na kolumnie INT. Ale wtedy, LIKE jest zawsze powolny, nawet jeśli wykonywane na polu varchar: Nie ma sposobu, aby mieć indeks, który przyspiesza kwerendę LIKE.

Może warto mieć drugą kolumnę varchar, która odzwierciedla wartości kolumny int i robi LIKE na tym poziomie - trzeba by sprawdzić, czy to coś dobrego.

+0

Czy korzystanie z narzędzia CAST jest szybsze niż przy użyciu funkcji CONVERT? – Maxx

+1

@Maxx są synonimami tej samej funkcji, więc nie ma różnicy. –

+0

{"Wyrażenie zawiera niezdefiniowane wywołanie funkcji CAST()."} Jest tym, co widzę :( – Maxx

4

Możesz convert int napisać przy użyciu CONVERT(ProductID, CHAR(16)) AS ProductID, a następnie użyć LIKE. Więc w twoim przypadku będzie to

SELECT ProductID, ProductName FROM Products 
WHERE CONVERT(ProductID, CHAR(16)) LIKE '%15%' 

Należy pamiętać, że zapytanie wykona pełne skanowanie tabeli bez wsparcia indeksów. W rezultacie będzie to naprawdę drogie i czasochłonne.

+0

Czy możesz być bardziej konkretny? Jestem jak noob :) Może warto podać przykład. – Maxx

+0

{"Wyrażenie zawiera niezdefiniowane wywołanie funkcji CHAR()."} Jest tym, co widzę. – Maxx

+0

Którą wersję MySQL używasz? – Jan

Powiązane problemy