2009-09-07 6 views
54

Ich möchte wie unten eine SQL-Anweisung schreiben:Wie kann ich mehrere Bedingungen in LIKE-Operator einführen

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

Ich weiß, kann es mit OR erfolgen. Aber ich möchte wissen, ob es eine bessere Lösung gibt. Hier

+1

Was ist falsch mit OR? Oder haben Sie dynamische Bedingungen? –

+0

Was ist los mit ORs? Das Volumen der Eingabe? –

+1

Offensichtlich habe ich ODER in Echtzeit verwendet. Aber ich möchte wissen, gibt es eine andere Möglichkeit zu ersetzen ODER – Madhu

Antwort

35

ist eine alternative Art und Weise:

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

Hier ist der Testcode zu überprüfen:

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

Dies ist eine gute Verwendung einer temporären Tabelle.

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

In den Beispielmustern, gibt es keine Möglichkeit col könnte mehr als ein Muster passen, so können Sie sicher, dass Sie in der Folge jede Zeile von tbl höchstens einmal sehen werden. Wenn Ihre Muster jedoch so sind, dass col mehrere Übereinstimmungen aufweisen kann, sollten Sie den Abfrage-Modifikator DISTINCT verwenden.

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

Dies funktioniert nicht für PostgreSQL-Benutzer – LittleBobbyTables

4

Dies könnte helfen:

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

Ich habe dies in SQL Server 2005 verwendet, und es funktioniert.

+6

Gibt es keine irrelevante Ergebnis? – NileshChauhan

+0

Dies ist perfekt zum Herausziehen von teilweise übereinstimmenden Codes aus Datensätzen, z. mit Zeichen, die an denselben Basiscode angehängt sind, um den geografischen Standort zu bezeichnen – Hilary

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

Dies funktioniert in Kröte und Powerbuilder. Sie wissen nicht, über den Rest

+2

Eigentlich ist das die Syntax, die das OP verwendet; sie wollten * Alternativen * zu dieser Formulierung. – APC

+0

Funktioniert auch in Oracle SQL-Entwickler. – Shams

35

Oracle 10g hat Funktionen, die die Verwendung von POSIX-kompatible reguläre Ausdrücke in SQL erlauben:

  • REGEXP_LIKE
  • REGEXP_REPLACE
  • REGEXP_INSTR
  • REGEXP_SUBSTR

Informationen zur Syntax dieser Funktionen finden Sie unter Oracle Database SQL Reference.

Werfen Sie einen Blick auf Regular expressions in Perl mit Beispielen.

Code:

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

Oracle kann sicherlich einen Index für 'LIKE 'ABC%' verwenden, aber ich glaube nicht, dass es einen Index für REGEX-Operationen verwenden kann (es sei denn, es handelt sich um einen funktionsbasierten Index) – symcbean

2

Ich hatte auch die gleiche Anforderung, wo ich nicht Wahl wie Operator entweder mehrmals passieren hatte eine OR oder Schreiben Union-Abfrage zu tun.

This worked for me in Oracle 11g: 

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

Selbst u diese

Funktion versuchen

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 

Abfrage

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

Wenn Ihr Parameterwert null auf Geschäft nicht festgelegt ist oder kann Ihr Wert basieren können Sie versuchen Sie den folgenden Ansatz.

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 

split Funktion

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 * Von tbl WHERE col LIKE '[0-9, a-z]%';

Verwenden Sie einfach diese Bedingung von wie in Sql und Sie erhalten Ihre gewünschte Antwort

Verwandte Themen