2009-09-07 11 views
54

Voglio scrivere un'istruzione SQL come di seguito:Come posso introdurre più condizioni in operatore LIKE

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

so che può essere fatto utilizzando OR. Ma io voglio sapere v'è alcuna soluzione migliore.

+1

Cosa c'è di sbagliato con OR? O hai una serie dinamica di condizioni? –

+0

Cosa c'è che non va con gli OR? Il volume della digitazione? –

+1

Ovviamente, ho usato OR in tempo reale. Ma voglio sapere se esiste un altro modo per sostituire OR – Madhu

risposta

35

Ecco un modo alternativo:

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

Ecco il codice di prova per verificare:

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) 
57

Questo è un buon uso di una tabella temporanea.

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); 

nei modelli di esempio, non c'è modo col potrebbe corrispondere a più di un modello, in modo da poter essere sicuro che vedrete ogni riga della tbl più di una volta nel risultato. Ma se i vostri modelli sono tali che col potrebbe corrispondere a più di uno, è necessario utilizzare il modificatore DISTINCT query.

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

Non funzionerà con gli utenti di PostgreSQL – LittleBobbyTables

4

Questo potrebbe aiutare:

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

Ho usato questo in SQL Server 2005 e ha funzionato.

+6

Non fornisce risultati irrilevanti? – NileshChauhan

+0

Questo è perfetto per estrarre codici parzialmente corrispondenti dai set di dati, ad es. con caratteri aggiunti allo stesso codice base per indicare la posizione geografica – Hilary

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

Questo funziona in rospo e powerbuilder. Non so circa il resto

+2

In realtà questa è la sintassi utilizzata dall'OP; volevano * alternative * a quella formulazione. – APC

+0

Funziona anche con lo sviluppatore Oracle SQL. – Shams

35

Oracle 10g ha funzioni che permettono l'utilizzo di espressioni regolari POSIX-compliant in SQL:

  • REGEXP_LIKE
  • REGEXP_REPLACE
  • REGEXP_INSTR
  • REGEXP_SUBSTR
  • 01.235.

Vedere la Oracle Database SQL Reference per i dettagli di sintassi di questa funzione.

Date un'occhiata a Regular expressions in Perl con esempi.

Codice:

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

Oracle può certamente utilizzare un indice per 'LIKE 'ABC%'' ma non credo che possa utilizzare un indice per le operazioni di REGEX (a meno che non si tratti di un indice basato sulle funzioni) – symcbean

2

Ho anche avuto la stessa esigenza in cui non ho avuto scelta di passare come operatore più volte da entrambe facendo una query OR o la scrittura unione.

This worked for me in Oracle 11g: 

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

Anche u può provare questo

Funzione

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 

Query

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+'%'; 
0

Se il valore del parametro non è fisso o il vostro valore può essere nullo basata su attività si può prova il seguente approccio.

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 

funzione 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)[email protected]); 
      END; 
     INSERT INTO @returnList 
       SELECT @stringToSplit; 
     RETURN; 
    END; 
0

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

utilizzare semplicemente questa condizione di like in sql e si otterrà la risposta desiderata

Problemi correlati