SQL中是否有「 LIKE」和「 IN」的組合?

在SQL I中,(不幸的)我常常不得不使用「 LIKE 」條件,由於數據庫違反了幾乎全部規範化規則。 我如今沒法更改。 但這與問題無關。 數據庫

此外,爲了更好地讀取和提升SQL語句的靈活性,我常常使用諸如WHERE something in (1,1,2,3,5,8,13,21)條件。 spa

有沒有可能在不編寫複雜的子選擇的狀況下將這兩件事結合起來的方法? code

我想要像在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,則最接近的是全文搜索: get

全文搜索,MySQL文檔 it


#2樓

儘管據我所知它只能在SQL Server 2008中運行,但我可能對此有解決方案。 我發現您可使用https://stackoverflow.com/a/7285095/894974中描述的行構造器使用like子句來鏈接「虛構」表。 聽起來比如今更復雜,請看: io

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

這將致使全部用戶都擁有相似於列表中提供的電子郵件地址。 但願對全部人有用。 問題困擾了我一段時間。 table


#3樓

這適用於逗號分隔的值 email

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+'%';
相關文章
相關標籤/搜索