在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,则最接近的是全文搜索:
#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+'%';
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3194850