Sql 如何在LIKE运算符中引入多个条件?
我想写一个SQL语句,如下所示:Sql 如何在LIKE运算符中引入多个条件?,sql,oracle,Sql,Oracle,我想写一个SQL语句,如下所示: select * from tbl where col like ('ABC%','XYZ%','PQR%'); 我知道可以使用或完成。但我想知道有没有更好的解决办法。这里有一个替代方法: select * from tbl where col like 'ABC%' union select * from tbl where col like 'XYZ%' union select * from tbl where col like 'PQR%'; 以下是
select * from tbl where col like ('ABC%','XYZ%','PQR%');
我知道可以使用
或完成。但我想知道有没有更好的解决办法。这里有一个替代方法:
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)
这是一个很好的使用临时表
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);
这可能有助于:
select * from tbl where col like '[ABC-XYZ-PQR]%'
我已经在SQLServer2005中使用了它,它很有效
select * from tbl where col like 'ABC%'
or col like 'XYZ%'
or col like 'PQR%';
这在toad和powerbuilder中工作。不知道其余的Oracle 10g具有允许在SQL中使用POSIX兼容正则表达式的函数:
- REGEXP\u LIKE
- REGEXP\u REPLACE
- REGEXP\u INSTR
- REGEXP\u SUBSTR
有关此函数的语法详细信息,请参见
用例子看一看
代码:
select * from tbl where regexp_like(col, '^(ABC|XYZ|PQR)');
我也有同样的要求,我没有选择通过执行或编写联合查询多次传递like运算符
This worked for me in Oracle 11g:
REGEXP_LIKE (column, 'ABC.*|XYZ.*|PQR.*');
即使你可以试试这个
作用
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
质疑
如果您的参数值不是固定的,或者您的值可以基于业务为空,那么您可以尝试以下方法
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
拆分字符串函数
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;
选择*
来自tbl
上校在哪里
比如“[0-9,a-z]%”
只要在sql中使用like的条件,您就会得到所需的答案OR有什么问题?或者你有一套动态的条件吗?ORs有什么问题?打字的数量?显然,我用的是实时的。但是我想知道有没有其他的方法来替换,或者有其他的方法,而不是将类似的谓词放在一起,但是没有更好的方法。如果选择查询很大,那么进行联合只是浪费时间。或者是最好的方式,足以帮助达到提问的目的。谢谢。实际上这就是OP使用的语法;他们希望使用该公式的替代方案。也适用于Oracle SQL developer。它不会给出不相关的结果吗?这非常适合从数据集中提取部分匹配的代码,例如,将字符附加到相同的基本代码以表示地理位置。它没有提供所需的记录。Acle当然可以使用之类的索引“ABC%”
但我不相信它可以为正则表达式操作使用索引(除非它是基于函数的索引),这是最好的方法。。。谢谢分享。这真的很有帮助,尽管这是一篇旧帖子。非常好,谢谢@stefannebsnakexcellent。这正是我从代码中删除硬编码值所需要的。我的字符串掩码存储在配置表中。旧代码对每一个都进行了硬编码。这不是一个用于更改值的优雅解决方案,如果我有任何新值,则需要更改控制协议。我不知道你可以使用语法“ON”(我的\u字段,比如我的\u掩码)。谢谢。是的!你可以使用任何想要的表达式作为连接条件。大多数人使用简单的相等比较,但这不是限制。
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;