如何在 SQL 中对数字字段使用 LIKE 条件?

问题描述 投票:0回答:11

我使用此查询来获取一些特定数据:“select * from emp where emp_name LIKE 's%'”;

emp_nam 是字符字段,如何使用与数字字段相同的逻辑条件?像这样的东西:

“从 emp 中选择 *,其中 emp_id ????

其中 emp_id 是数字字段。

谢谢,

sql ms-access jet
11个回答
11
投票

不能对数字使用通配符,但是,如果确实需要,可以将数字转换为 varchar,然后执行通配符匹配。

例如。

SELECT * FROM emp WHERE CONVERT(varchar(20), emp_id) LIKE '1%'

8
投票

在 Access 中,您可以将数字字段与空字符串连接起来,将其强制转换为可以使用 LIKE 进行比较的字符串:

select * from emp where emp_id & '' like '123*'

另请注意,Access 使用 * 而不是 % 作为通配符。请参阅:Like 运算符 (Microsoft Access SQL)


4
投票

不,您不能将

LIKE
用于数字字段。 尝试使用
<
>
=
>=
<=
;)

如果您想在数字字段中搜索“以 12 开头”或类似的内容,则您的设计不符合您的需求。


3
投票

在 Access 数据库引擎 SQL 语法中,要使用

%
通配符,您必须使用 ANSI-92 查询模式或使用
ALIKE
关键字代替
LIKE
关键字。

有关 ANSI-92 查询模式的详细信息,请参阅 Access2003 帮助中的关于 ANSI SQL 查询模式 (MDB)(这同样适用于 Access2007 中的 ACE,但由于某种原因从 Access2007 帮助中删除了该主题)。如果您在代码中执行此操作,则需要使用 OLE DB,例如VBA 中的 ADO 经典。

对于

ALIKE
关键字...你不会找到太多。它是官方未记录的功能之一,这意味着存在可能从 Access 数据库引擎的未来版本中删除它的风险。就我个人而言,我会冒着必须为 ANSI-89 查询模式和 ANSI-92 查询模式显式编码的风险,因为验证规则和
CHECK
约束是必需的(请参见下面的示例)。两者都可以进行编码,但要正确执行会更加冗长且棘手,也就是说,如果出错,则会面临更直接的风险。

这就是答案。现在是“解决方案”...

显然,如果您需要对 emp_id 执行此类查询,那么域是错误的,即它不应该是数字字段。

治愈疾病:更改架构以使其成为文本字段,添加域规则以确保其仅包含数字字符,例如

CHECK (emp_id NOT LIKE '%[^0-9]%')

编辑现在已添加“Jet”标签。上面的

CHECK
约束需要重写,因为Access数据库引擎有自己的语法:用
^
替换
!
字符。另外,为了使其与 ANSI-89 查询模式和 ANSI-92 查询模式兼容,请使用 ALIKE 关键字,即

CHECK (emp_id NOT ALIKE '%[!0-9]%')

3
投票

“%”通配符在 MS-SQL 服务器上对我有用。请参阅 http://technet.microsoft.com/en-us/library/aa933232%28v=sql.80%29.aspx

查询

select * from MyTable where ID like '548%'
适用于 MS-SQL Server 2008 R2,返回 ID 为 5481,5485 等的结果。ID 列为
int
类型。


2
投票

使用 CONCAT 隐式将整数转换为字符串

从城市中选择 * WHERE CONCAT(id_city,'') LIKE '%119%'


1
投票

cast
字段上使用
convert
emp_id
功能,您可以与
like
进行比较。


0
投票

嗨,我在使用浮点数时遇到了麻烦,我不得不投射两次cast(cast(EmpId as bigint) as varchar(15)),如'%903%'希望有人觉得这有帮助


0
投票

在 FileMaker SQL 中,您可以使用 STRVAL 函数将任何字段转换为字符串:

SELECT * FROM emp WHERE STRVAL(emp_id) LIKE '1%'


这是在 FileMaker 中使用此功能的真实示例:

如何列出数字字段中包含 ASCII 0 的所有记录

SELECT emp_id FROM emp WHERE STRVAL(someNumericField) LIKE '%'+CHR(0)+'%'


0
投票

这对我有用(MySql):

SELECT * FROM TABLA_UNO WHERE CAST(NRO_ID AS VARCHAR(12)) LIKE '%355%'; (NRO_ID 是整数数据类型)

从 ASIENTOS 中选择 * WHERE CAST(COTIZACION AS VARCHAR(12)) LIKE '%40.11%'; (COTIZACION 是十进制数据类型)

从 ASIENTOS 中选择 * WHERE CAST(FECHA AS VARCHAR(12)) LIKE '%2023%'; (FECHA 是日期)


0
投票

在Where 子句中写入数值表达式。

例如:选择最后 2 位数字为 20 结尾的数字 Col1:

WHERE Column1-(Column1/100) = 20
(Divide by 100 is integer division). 

选择 Col1 何时以 50 开头:

WHERE ( Col1 >= 500 and Col1 <= 509) OR ( Col1 >= 5000 and Col1 <= 5099)  
OR ( Col1 >= 50000 and Col1 <= 50999) etc. (depending on the numeric column 
width). 

或者:

floor (log10 (abs (Col1))) + 1
返回数字中的位数。因此,以下可能是必需的条款。

  WHERE Col1> 0 AND Col1 / ((floor (log10 (abs (x))) + 1 - 2)  * 100)= 50 

(-2是获取Col1的前2位)。

© www.soinside.com 2019 - 2024. All rights reserved.