在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中實現。 文檔
若是您使用的是MySQL,則最接近的是全文搜索: get
全文搜索,MySQL文檔 it
儘管據我所知它只能在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
這適用於逗號分隔的值 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%')
若是要使用索引,則必須省略第一個'%'
字符。
作這個
WHERE something + '%' in ('bla', 'foo', 'batz') OR '%' + something + '%' in ('tra', 'la', 'la')
要麼
WHERE something + '%' in (select col from table where ....)
你甚至能夠嘗試這個
功能
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+'%';