2011-12-15 7 views
10

In SQL, se si desidera eseguire un SELECT con un carattere jolly, devi usare:Come selezionare utilizzando sia i caratteri jolly (LIKE) che l'array (IN)?

SELECT * FROM table_name WHERE field_name LIKE '%value%' 

Se si voleva utilizzare una matrice di valori possibili, utilizza:

SELECT * FROM table_name WHERE field_name IN ('one', 'two', 'three') 

Ma, cosa faresti se volessi usare entrambi i caratteri jolly E un array?

Un po 'come:

SELECT * FROM table_name WHERE field_name LIKE IN ('%one', '_two', 'three[abv]') 
+0

Se si utilizza MySQL, questo è un possibile duplicato: http: // s tackoverflow.com/questions/1127088/mysql-like-in –

+0

possibile duplicato di [Utilizzo di SQL LIKE e IN insieme] (http://stackoverflow.com/questions/2318126/using-sql-like-and-in-together) – Ben

risposta

11
SELECT * 
FROM table_name 
WHERE field_name LIKE '%one' 
    OR field_name LIKE '_two' 
    OR field_name LIKE 'three[abv]' 
+0

Speravo di evitare il sovraccarico di questo, ma sembrerebbe essere l'unico modo. Come succede, anche farlo in questo modo provoca un sovraccarico enorme come ho una serie di un paio di centinaia di voci. Usare solo IN è veloce. LIKE richiede per sempre: / – Dave

2

è possibile utilizzare unirsi con la dichiarazione come come di seguito query:

SELECT * FROM table_name t 
JOIN dbo.Split('one,two,three',',') s ON t.field_name LIKE N'%'+s.item+'%' 

creo questa funzione per dividere stringa:

CREATE FUNCTION [dbo].[Split] (@StringToSplit NVARCHAR(MAX), @SpliterChar CHAR(1)) 
RETURNS 
    @returnList TABLE ([item] [NVARCHAR] (500)) 
AS 
BEGIN 
DECLARE @nItem NVARCHAR(500); 
DECLARE @pos INT; 
WHILE CHARINDEX(@SpliterChar, @StringToSplit) > 0 
BEGIN 
    SELECT @pos = CHARINDEX(@SpliterChar, @StringToSplit); 
    SELECT @nItem = SUBSTRING(@StringToSplit, 1, @pos-1); 
    if (@nItem <> '') INSERT INTO @returnList SELECT @nItem; 
    SELECT @StringToSplit = SUBSTRING(@StringToSplit, @pos+1, LEN(@StringToSplit)[email protected]); 
END 
if (@StringToSplit<>'') INSERT INTO @returnList SELECT @StringToSplit; 
RETURN 
END