如何将IN运算符与LIKE条件相结合(或获得可比结果的最佳方法)

tpu*_*nen 4 sql sql-server oracle

我需要选择一个字段以几个不同前缀之一开头的行:

select * from table 
where field like 'ab%' 
  or field like 'cd%' 
  or field like "ef%" 
  or...
Run Code Online (Sandbox Code Playgroud)

在Oracle或SQL Server中使用SQL执行此操作的最佳方法是什么?我正在寻找类似以下语句(不正确)的内容:

select * from table where field like in ('ab%', 'cd%', 'ef%', ...)
Run Code Online (Sandbox Code Playgroud)

要么

select * from table where field like in (select foo from bar)
Run Code Online (Sandbox Code Playgroud)

编辑:我想看看如何通过在一个SELECT语句中给出所有前缀,将所有前缀存储在帮助程序表中来完成此操作.

前缀的长度不固定.

Lie*_*ers 16

将前缀表与实际表连接在一起可以在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 
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 6

你可以尝试正则表达式

SELECT * from table where REGEXP_LIKE ( field, '^(ab|cd|ef)' );
Run Code Online (Sandbox Code Playgroud)


wom*_*omp 5

如果你的前缀总是两个字符,你不能只使用SUBSTRING()函数来获取"field"的前两个字符,然后查看它是否在前缀列表中?

select * from table
where SUBSTRING(field, 1, 2) IN (prefix1, prefix2, prefix3...)
Run Code Online (Sandbox Code Playgroud)

如果不是性能,这在简单性方面将是"最好的".在性能方面,您可以创建一个索引虚拟列,从"字段"生成前缀,然后使用谓词中的虚拟列.