web-dev-qa-db-fra.com

Comment puis-je introduire plusieurs conditions dans l'opérateur LIKE

Je veux écrire une instruction SQL comme ci-dessous:

select * from tbl where col like ('ABC%','XYZ%','PQR%');

Je sais que cela peut être fait en utilisant OR. Mais je veux savoir s'il existe une meilleure solution.

64
Madhu

Voici un autre moyen:

select * from tbl where col like 'ABC%'
union
select * from tbl where col like 'XYZ%'
union
select * from tbl where col like 'PQR%';

Voici le code de test à vérifier:

create table tbl (col varchar(255));
insert into tbl (col) values ('ABCDEFG'), ('HIJKLMNO'), ('PQRSTUVW'), ('XYZ');
select * from tbl where col like 'ABC%'
union
select * from tbl where col like 'XYZ%'
union
select * from tbl where col like 'PQR%';
+----------+
| col      |
+----------+
| ABCDEFG  |
| XYZ      |
| PQRSTUVW |
+----------+
3 rows in set (0.00 sec)
39
Asaph

C'est un bon usage d'une table temporaire.

CREATE TEMPORARY TABLE patterns (
  pattern VARCHAR(20)
);

INSERT INTO patterns VALUES ('ABC%'), ('XYZ%'), ('PQR%');

SELECT t.* FROM tbl t JOIN patterns p ON (t.col LIKE p.pattern);

Dans les exemples de modèle, il est impossible que col puisse correspondre à plus d'un modèle. Vous pouvez donc être sûr de voir chaque ligne de tbl au plus une fois dans le résultat. Mais si vos modèles sont tels que col puisse correspondre à plusieurs, vous devez utiliser le modificateur de requête DISTINCT.

SELECT DISTINCT t.* FROM tbl t JOIN patterns p ON (t.col LIKE p.pattern);
57
Bill Karwin

Oracle 10g dispose de fonctions permettant d'utiliser des expressions régulières SQL compatibles avec POSIX:

  • REGEXP_LIKE
  • REGEXP_REPLACE
  • REGEXP_INSTR
  • REGEXP_SUBSTR

Voir Oracle Database SQL Reference pour les détails sur la syntaxe de cette fonction.

Jetez un coup d'œil à Expressions régulières en Perl avec des exemples.

Code:

    select * from tbl where regexp_like(col, '^(ABC|XYZ|PQR)');
37
stefannebesnak

Cela pourrait aider:

select * from tbl where col like '[ABC-XYZ-PQR]%'

J'ai utilisé cela dans SQL Server 2005 et cela a fonctionné.

4
Eric
select * from tbl where col like 'ABC%'
or col like 'XYZ%'
or col like 'PQR%';

Cela fonctionne dans crapaud et powerbuilder. Je ne sais pas pour le reste

3
KathMania

J'avais également la même exigence, où je n'avais pas le choix de passer plusieurs fois comme opérateur, soit en faisant une requête OR, soit en écrivant une requête d'union.

This worked for me in Oracle 11g:

REGEXP_LIKE (column, 'ABC.*|XYZ.*|PQR.*'); 
2
asad

SELECT * De tbl WHERE col LIKE '[0-9, a-z]%';

utilisez simplement cette condition de comme en sql et vous obtiendrez votre réponse souhaitée

0
Harry Sandal

Si votre valeur de paramètre n'est pas fixe ou si votre valeur peut être nulle en fonction des entreprises, vous pouvez essayer l'approche suivante.

DECLARE @DrugClassstring VARCHAR(MAX);
SET @DrugClassstring = 'C3,C2'; -- You can pass null also

---------------------------------------------

IF @DrugClassstring IS NULL 
    SET @DrugClassstring = 'C3,C2,C4,C5,RX,OT'; -- If null you can set your all conditional case that will return for all
SELECT dn.drugclass_FK , dn.cdrugname
FROM drugname AS dn
INNER JOIN dbo.SplitString(@DrugClassstring, ',') class ON dn.drugclass_FK = class.[Name] -- SplitString is a a function

Fonction SplitString  

SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER FUNCTION [dbo].[SplitString](@stringToSplit VARCHAR(MAX),
                                   @delimeter     CHAR(1)      = ',')
RETURNS @returnList TABLE([Name] [NVARCHAR](500))
AS
     BEGIN

         --It's use in report sql, before any change concern to everyone

         DECLARE @name NVARCHAR(255);
         DECLARE @pos INT;
         WHILE CHARINDEX(@delimeter, @stringToSplit) > 0
             BEGIN
                 SELECT @pos = CHARINDEX(@delimeter, @stringToSplit);
                 SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1);
                 INSERT INTO @returnList
                        SELECT @name;
                 SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos);
             END;
         INSERT INTO @returnList
                SELECT @stringToSplit;
         RETURN;
     END;
0
atik sarker

Même tu peux essayer ça

Une fonction

CREATE  FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20))
RETURNS @Strings TABLE
(   
  position int IDENTITY PRIMARY KEY,
  value varchar(8000)  
)
AS
BEGIN

DECLARE @index int
SET @index = -1

WHILE (LEN(@text) > 0)
  BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
      BEGIN  
        INSERT INTO @Strings VALUES (@text)
          BREAK 
      END 
    IF (@index > 1) 
      BEGIN  
        INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))  
        SET @text = RIGHT(@text, (LEN(@text) - @index)) 
      END 
    ELSE
      SET @text = RIGHT(@text, (LEN(@text) - @index))
    END
  RETURN
END

Question

select * from my_table inner join (select value from fn_split('ABC,MOP',','))
as split_table on my_table.column_name like '%'+split_table.value+'%';