mysql-一起使用SQL LIKE和IN
有没有办法同时使用LIKE和IN?
我想实现这样的目标。
SELECT * FROM tablename WHERE column IN ('M510%', 'M615%', 'M515%', 'M612%');
因此,基本上,我希望能够用一堆不同的字符串来匹配该列。 是否有另一种方法可以对一个查询执行此操作,还是我必须遍历要查找的字符串数组?
Nick asked 2020-06-26T17:09:21Z
10个解决方案
58 votes
如何在IN中使用子字符串。
select * from tablename where substring(column,1,4) IN ('M510','M615','M515','M612')
tvanfosson answered 2020-06-26T17:10:10Z
54 votes
您可以通过在一个查询中将各个LIKE与OR串在一起来完成此操作:
SELECT * FROM tablename
WHERE column LIKE 'M510%'
OR column LIKE 'M615%'
OR column LIKE 'M515%'
OR column LIKE 'M612%';
请注意,像LIKE和per-row函数之类的东西并不总是能够很好地扩展。 如果表可能会变大,则可能需要考虑向表中添加另一列以独立存储字段的前四个字符。
这将复制数据,但是您可以通过使用插入和更新触发器来保证数据保持一致。 然后在该新列上添加索引,您的查询将变为:
SELECT * FROM tablename WHERE newcolumn IN ('M510','M615','M515','M612');
这会将计算成本移到了必要的程度(数据更改时),而不是每次读取时都如此。 实际上,您甚至可以走得更远,将新列作为布尔值表示它是四种特殊类型之一(如果那组特殊类型很少更改)。 然后查询将更快:
SELECT * FROM tablename WHERE is_special = 1;
这种对速度的存储需求的权衡是大型数据库的一个有用技巧-通常,磁盘空间便宜,CPU占用大量资源,并且读取数据的频率远高于写入数据。 通过将计算成本移至写入阶段,可以在所有读取中摊销成本。
paxdiablo answered 2020-06-26T17:09:50Z
8 votes
您需要使用多个LIKE词,再加上OR。
Ignacio Vazquez-Abrams answered 2020-06-26T17:10:30Z
5 votes
使用较长的IN,即一堆OR。
SELECT * FROM tablename
WHERE column LIKE 'M510%'
OR column LIKE 'M615%'
OR column LIKE 'M515%'
OR column LIKE 'M612%';
Yada answered 2020-06-26T17:10:50Z
2 votes
substr([column name],
[desired starting position (numeric)],
[# characters to include (numeric)]) in ([complete as usual])
例
substr([column name],1,4) in ('M510','M615', 'M515', 'M612')
MissPeri30 answered 2020-06-26T17:11:10Z
2 votes
SELECT * FROM tablename
WHERE column IN
(select column from tablename
where column like 'M510%'
or column like 'M615%'
OR column like 'M515%'
or column like'M612%'
)
matt answered 2020-06-26T17:11:26Z
1 votes
我尝试了另一种方式
说表有值1 M510
2 M615
3 M515
4 M612
5 M510MM
6 M615NN
7 M515OO
8 M612PP
9 A
10 B
11 C
12 D
这里第1列到第8列有效,而其余的则无效
SELECT COL_VAL
FROM SO_LIKE_TABLE SLT
WHERE (SELECT DECODE(SUM(CASE
WHEN INSTR(SLT.COL_VAL, COLUMN_VALUE) > 0 THEN
1
ELSE
0
END),
0,
'FALSE',
'TRUE')
FROM TABLE(SYS.DBMS_DEBUG_VC2COLl('M510', 'M615', 'M515', 'M612'))) =
'TRUE'
我所做的是使用INSTR函数,我试图找到的是表中的值与任何输入值匹配。 如果确实如此,它将返回其索引,即大于零。 如果表的值与任何输入都不匹配,则它将返回零。 我加总了这个索引,以表明匹配成功。
它似乎正在工作。
希望能帮助到你。
Rohan answered 2020-06-26T17:12:08Z
1 votes
您可以对通配符使用子查询:
SELECT 'Valid Expression'
WHERE 'Source Column' LIKE (SELECT '%Column' --FROM TABLE)
或者,您可以使用单个字符串:
SELECT 'Valid Expression'
WHERE 'Source Column' LIKE ('%Source%' + '%Column%')
Dustin Buschow answered 2020-06-26T17:12:32Z
1 votes
你甚至可以尝试这个
功能
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('M510', 'M615', 'M515', 'M612',','))
as split_table on my_table.column_name like '%'+split_table.value+'%';
SimarjeetSingh Panghlia answered 2020-06-26T17:13:01Z
0 votes
对于完美的动态解决方案,可以通过组合光标和临时表来实现。 使用此解决方案,您无需知道起始位置或长度,并且它是可扩展的,而无需在您的SQL查询中添加任何OR。
对于此示例,假设您要从某个表中选择某个ID,详细信息和创建日期,该表中的某些文本列表位于“详细信息”中。
首先,在名为Search的列中创建带有搜索字符串的表FilterTable。
按照问题初学者的要求:
insert into [DATABASE].dbo.FilterTable
select 'M510' union
select 'M615' union
select 'M515' union
select 'M612'
然后,您可以按以下方式过滤数据:
DECLARE @DATA NVARCHAR(MAX)
CREATE TABLE #Result (ID uniqueIdentifier, Details nvarchar(MAX), Created datetime)
DECLARE DataCursor CURSOR local forward_only FOR
SELECT '%' + Search + '%'
FROM [DATABASE].dbo.FilterTable
OPEN DataCursor
FETCH NEXT FROM DataCursor INTO @DATA
WHILE @@FETCH_STATUS = 0
BEGIN
insert into #Result
select ID, Details, Created
from [DATABASE].dbo.Table (nolock)
where Details like @DATA
FETCH NEXT FROM DataCursor INTO @DATA
END
CLOSE DataCursor
DEALLOCATE DataCursor
select * from #Result
drop table #Result
希望这对您有所帮助
Digital Competitive answered 2020-06-26T17:13:43Z