如何在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中,你会得到你想要的答案