2010-01-25 39 views
4

我需要在那里现场与几个不同的前缀一个人开始选择行IN操作符组合:如何与LIKE条件(或获得类似的结果最好的方法)

select * from table 
where field like 'ab%' 
    or field like 'cd%' 
    or field like "ef%" 
    or... 

什么是做的最好的方法这在Oracle或SQL Server中使用SQL?我正在寻找类似下面的语句(这是不正确的):

select * from table where field like in ('ab%', 'cd%', 'ef%', ...) 

select * from table where field like in (select foo from bar) 

编辑: 我想看看这是怎么用或者让所有前缀在做一个SELECT语句,将所有前缀存储在助手表中。

前缀的长度不固定。

+0

这些不同的前缀是否会改变? – 2010-01-25 08:03:33

+0

可能有数百个前缀,但我希望看到这两个选项都将它们放在一个SQL子句中并将它们存储在助手表中 – tputkonen 2010-01-25 08:12:14

回答

14

将您的前缀表与您的实际表连接起来可以在SQL Server & Oracle中工作。

DECLARE @Table TABLE (field VARCHAR(32)) 
DECLARE @Prefixes TABLE (prefix VARCHAR(32)) 

INSERT INTO @Table VALUES ('ABC') 
INSERT INTO @Table VALUES ('DEF') 
INSERT INTO @Table VALUES ('ABDEF') 
INSERT INTO @Table VALUES ('DEFAB') 
INSERT INTO @Table VALUES ('EFABD') 

INSERT INTO @Prefixes VALUES ('AB%') 
INSERT INTO @Prefixes VALUES ('DE%') 

SELECT t.* 
FROM @Table t 
     INNER JOIN @Prefixes pf ON t.field LIKE pf.prefix 
+1

+1 - 我喜欢这个主意! – Rippo 2010-01-25 08:42:35

+0

+1喜欢这个解决方案。 – systempuntoout 2010-03-17 13:17:53

5

如果你的前缀始终是两个字符,你能不能只使用SUBSTRING()函数来获得“场”的前两个字符,然后看它是否在前缀列表?

select * from table 
where SUBSTRING(field, 1, 2) IN (prefix1, prefix2, prefix3...) 

就简单性而言,如果不是性能,这将是“最佳”。在性能方面,您可以创建一个索引虚拟列,从“字段”生成前缀,然后在谓词中使用虚拟列。

+0

谢谢! 前缀不是固定长度。我编辑了这个问题。 – tputkonen 2010-01-25 08:15:28

+0

啊太糟糕了。我将回答我的问题,只是为了解决类似问题的任何人的想法。 – womp 2010-01-25 08:17:26

1

根据数据集的大小,REGEXP解决方案可能是也可能不是正确的答案。如果你想获得一个大的数据集的一小部分,

select * from table 
where field like 'ab%' 
    or field like 'cd%' 
    or field like "ef%" 
    or... 

可以在幕后被改写为

select * from table 
where field like 'ab%' 
union all 
select * from table 
where field like 'cd%' 
union all 
select * from table 
where field like 'ef%' 

做3次索引扫描,而不是一个完整的扫描。

如果你知道你只是追求前两个字符,创建一个基于函数的索引也是一个很好的解决方案。他们之间如果你真的需要优化此,使用全局临时表来存储感兴趣的值,并进行半联接:

select * from data_table 
where transform(field) in (select pre_transformed_field 
           from my_where_clause_table); 
0

您也可以尝试这样的,在这里TMP是暂时的表由所需的前缀填充。它是一个简单的方法,并完成这项工作。

select * from emp join 
(select 'ab%' as Prefix 
union 
select 'cd%' as Prefix 
union 
select 'ef%' as Prefix) tmp 
on emp.Name like tmp.Prefix 
相关问题