Sql 如何在LIKE运算符中引入多个条件?

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%'; 以下是

我想写一个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%';
以下是要验证的测试代码:

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;