SQL中是否有“ LIKE”和“ IN”的组合?

孤人 提交于 2020-03-14 18:16:34

在SQL I中,(不幸的)我经常不得不使用“ LIKE ”条件,因为数据库违反了几乎所有规范化规则。 我现在无法更改。 但这与问题无关。

此外,为了更好地读取和提高SQL语句的灵活性,我经常使用诸如WHERE something in (1,1,2,3,5,8,13,21)条件。

有没有可能在不编写复杂的子选择的情况下将这两件事结合起来的方法?

我想要像在WHERE something LIKE ('bla%', '%foo%', 'batz%')一样简单的WHERE something LIKE ('bla%', '%foo%', 'batz%')而不是这样:

WHERE something LIKE 'bla%'
OR something LIKE '%foo%'
OR something LIKE 'batz%'

我在这里使用SQl Server和Oracle,但是我很感兴趣是否可以在任何RDBMS中实现。


#1楼

如果您使用的是MySQL,则最接近的是全文搜索:

全文搜索,MySQL文档


#2楼

尽管据我所知它只能在SQL Server 2008中运行,但我可能对此有解决方案。 我发现您可以使用https://stackoverflow.com/a/7285095/894974中描述的行构造器使用like子句来连接“虚构”表。 听起来比现在更复杂,请看:

SELECT [name]
  ,[userID]
  ,[name]
  ,[town]
  ,[email]
FROM usr
join (values ('hotmail'),('gmail'),('live')) as myTable(myColumn) on email like '%'+myTable.myColumn+'%' 

这将导致所有用户都拥有类似于列表中提供的电子邮件地址。 希望对所有人有用。 问题困扰了我一段时间。


#3楼

这适用于逗号分隔的值

DECLARE @ARC_CHECKNUM VARCHAR(MAX)
SET @ARC_CHECKNUM = 'ABC,135,MED,ASFSDFSF,AXX'
SELECT ' AND (a.arc_checknum LIKE ''%' + REPLACE(@arc_checknum,',','%'' OR a.arc_checknum LIKE ''%') + '%'')''

评估为:

 AND (a.arc_checknum LIKE '%ABC%' OR a.arc_checknum LIKE '%135%' OR a.arc_checknum LIKE '%MED%' OR a.arc_checknum LIKE '%ASFSDFSF%' OR a.arc_checknum LIKE '%AXX%')

如果要使用索引,则必须省略第一个'%'字符。


#4楼

做这个

WHERE something + '%' in ('bla', 'foo', 'batz')
OR '%' + something + '%' in ('tra', 'la', 'la')

要么

WHERE something + '%' in (select col from table where ....)

#5楼

你甚至可以尝试这个

功能

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+'%';
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!