mysql in和like_mysql-一起使用SQL LIKE和IN

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值