Как я могу ввести несколько условий в операторе LIKE

54

Я хочу написать инструкцию SQL, как показано ниже:

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

Я знаю, что это можно сделать, используя OR. Но я хочу знать, есть ли лучшее решение.

  • 1
    Что не так с ИЛИ? Или у вас есть динамический набор условий?
  • 0
    Что не так с операционными системами? Объем набора текста?
Показать ещё 4 комментария
Теги:

9 ответов

34
Лучший ответ

Вот альтернативный способ:

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

Вот тестовый код для проверки:

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

Это полезно использовать временную таблицу.

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

В примерах шаблонов нет способа, чтобы col мог сопоставлять более одного шаблона, поэтому вы можете быть уверены, что каждую строку tbl больше не увидите в результате. Но если ваши шаблоны таковы, что col может соответствовать более чем одному, вы должны использовать модификатор запроса DISTINCT.

SELECT DISTINCT t.* FROM tbl t JOIN patterns p ON (t.col LIKE p.pattern);
  • 0
    Это не будет работать для пользователей PostgreSQL
33

Oracle 10g имеет функции, которые позволяют использовать регулярные выражения, совместимые с POSIX, в SQL:

  • REGEXP_LIKE
  • REGEXP_REPLACE
  • REGEXP_INSTR
  • REGEXP_SUBSTR

См. Oracle Database SQL Reference для подробных сведений о синтаксисе этих функций.

Взгляните на регулярные выражения в Perl с примерами.

Код:

    select * from tbl where regexp_like(col, '^(ABC|XYZ|PQR)');
  • 1
    Oracle, безусловно, может использовать индекс для LIKE 'ABC%' но я не верю, что он может использовать индекс для операций REGEX (если это не индекс на основе функций)
4

Это может помочь:

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

Я использовал это в SQL Server 2005 и работал.

  • 6
    Разве это не дает неактуального результата?
  • 0
    Это идеально подходит для извлечения частично совпадающих кодов из наборов данных, например, с символами, добавленными к одному и тому же базовому коду для обозначения географического местоположения
3
select * from tbl where col like 'ABC%'
or col like 'XYZ%'
or col like 'PQR%';

Это работает в жабе и powerbuilder. Не знаю об остальных

  • 2
    На самом деле это синтаксис, используемый OP; они хотели альтернативы этой формулировке.
  • 0
    Работает в Oracle SQL Developer тоже.
2

У меня также было такое же требование, когда у меня не было выбора, чтобы пройти как оператор несколько раз, выполнив запрос OR или write union.

This worked for me in Oracle 11g:

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

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

просто используйте это условие как в sql, и вы получите желаемый ответ

0

Если значение вашего параметра не фиксировано или ваше значение может быть нулевым на основе бизнеса, вы можете попробовать следующий подход.

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

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

Даже вы можете попробовать это

Функция

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

Запрос

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню