如何在LIKE操作符中引入多个条件?

我想写一个如下所示的SQL语句:

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

我知道可以用OR来完成。 但是我想知道有没有更好的解决scheme。

这是另一种方法:

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

以下是validation的testing代码:

 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) 

这是一个很好的使用临时表。

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

Oracle 10g具有允许在SQL中使用符合POSIX的正则expression式的函数:

  • REGEXP_LIKE
  • REGEXP_REPLACE
  • REGEXP_INSTR
  • REGEXP_SUBSTR

有关此function的语法详细信息,请参阅Oracle数据库SQL参考 。

用例子来看Perl中的正则expression式 。

代码:

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

这可能有助于:

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

我已经在SQL Server 2005中使用了它,它工作。

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

这工作在蟾蜍和powerbuilder。 不知道其余的

我也有相同的要求,我没有select像操作符一样多次通过OR或写联合查询。

 This worked for me in Oracle 11g: REGEXP_LIKE (column, 'ABC.*|XYZ.*|PQR.*'); 

即使你可以试试这个

function

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

如果您的参数值不固定,或者您的值可以根据业务为空,则可以尝试以下方法。

 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 aa 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'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; 

SELECT * from tbl WHERE col LIKE'[0-9,az]%';

简单地使用这个条件就像在SQL中,你会得到你想要的答案