it-swarm.com.de

Wie kann ich mehrere Bedingungen in den LIKE-Operator einführen?

Ich möchte eine SQL-Anweisung wie folgt schreiben:

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

Ich weiß, dass es mit OR möglich ist. Aber ich möchte wissen, ob es eine bessere Lösung gibt.

64
Madhu

Hier ist ein alternativer Weg:

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 zu überprüfende Testcode:

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

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, dass col mit mehr als einem Muster übereinstimmt. Sie können also sicher sein, dass Sie jede Zeile von tbl höchstens einmal im Ergebnis sehen. Wenn Ihre Muster jedoch so sind, dass col mit mehr als einem übereinstimmen könnte, sollten Sie den Abfragemodifizierer DISTINCT verwenden.

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

Oracle 10g verfügt über Funktionen, die die Verwendung von POSIX-kompatiblen regulären Ausdrücken in SQL ermöglichen:

  • REGEXP_LIKE
  • REGEXP_REPLACE
  • REGEXP_INSTR
  • REGEXP_SUBSTR

Weitere Informationen zu diesen Funktionen finden Sie in der Oracle Database SQL-Referenz .

Werfen Sie einen Blick auf Reguläre Ausdrücke in Perl mit Beispielen.

Code:

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

Das könnte helfen:

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

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

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

Dies funktioniert in Kröte und Powerbuilder. Ich weiß nicht über den Rest Bescheid

3
KathMania

Ich hatte auch die gleiche Anforderung, bei der ich keine Wahl hatte, den Operator mehrmals zu übergeben, indem entweder ein OR oder eine Verbundabfrage geschrieben wurde.

This worked for me in Oracle 11g:

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

SELECT * Aus dem TB WHERE Spalte__. LIKE '[0-9, a-z]%';

verwenden Sie einfach diese Bedingung wie in SQL und Sie erhalten Ihre gewünschte Antwort

0
Harry Sandal

Wenn Ihr Parameterwert nicht festgelegt ist oder Ihr Wert je nach Geschäftsart null sein kann, können Sie den folgenden Ansatz verwenden.

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

SplitString-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
atik sarker

Sogar du kannst es versuchen

Funktion

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