web-dev-qa-db-fra.com

Comment sélectionner en utilisant à la fois des caractères génériques (LIKE) et un tableau (IN)?

En SQL, si vous voulez effectuer un SELECT avec un caractère générique, vous utiliseriez:

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

Si vous voulez utiliser un tableau de valeurs possibles, utilisez:

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

Mais que feriez-vous si vous vouliez utiliser les deux caractères génériques ET un tableau?

Un peu comme:

SELECT * FROM table_name WHERE field_name LIKE IN ('%one', '_two', 'three[abv]')
13
Dave
SELECT *
FROM table_name
WHERE field_name LIKE '%one'
   OR field_name LIKE '_two'
   OR field_name LIKE 'three[abv]'
11
LaGrandMere

vous pouvez utiliser join avec comme déclaration comme ci-dessous requête: 

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

Je crée cette fonction pour scinder une chaîne:

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)-@pos);
 END
 if (@StringToSplit<>'') INSERT INTO @returnList SELECT @StringToSplit;
 RETURN
END
2
ali youhannaei