Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL-忽略LIKE表达式中的字符序列_Sql_Regex_Postgresql - Fatal编程技术网

PostgreSQL-忽略LIKE表达式中的字符序列

PostgreSQL-忽略LIKE表达式中的字符序列,sql,regex,postgresql,Sql,Regex,Postgresql,我想知道是否有一种方法可以忽略PostgreSQL表达式中的字符序列,如。 在我的表中有一些值,它们以不同数量的零开始。我希望能够找到合适的值,而不必在类似的表达式中放入这些零。 有一个例子: id value 1 00045 2 00145 3 00003 现在,当我开始寻找值00045时,我只想键入“45”,并且只返回id=1的连接值。像“%45”显然是不可能的,因为我不希望选择值00145。 有简单的方法吗?在比较()之前,可以在where子句中将字段转换为整数: 如果您知道val

我想知道是否有一种方法可以忽略PostgreSQL表达式中的字符序列,如。
在我的表中有一些值,它们以不同数量的零开始。我希望能够找到合适的值,而不必在类似的表达式中放入这些零。 有一个例子:

id value
1  00045
2  00145
3  00003
现在,当我开始寻找值00045时,我只想键入“45”,并且只返回id=1的连接值。像“%45”显然是不可能的,因为我不希望选择值00145。


有简单的方法吗?

在比较()之前,可以在where子句中将字段转换为整数:

如果您知道
value
总是包含一些内容,那么您可以省略coalesce():


您可以使用
ltrim()
函数。需要第二个前导字符参数来省略:

select *
from example e
where ltrim(e.value, '0') = '45';
或者,如果值的长度始终为5个字符,则可以使用:

select *
from example e
where e.value = lpad('45', 5, '0');

第一种方法的优点是它不假设值是整数。第二种方法的优点是,它允许Postgres在
示例(值)
上使用索引(如果有的话)。

这(第一种方法)看起来很有希望;然而,当我像
where ltrim(e.value,'0')那样使用它时,我像
一样在'0'附近得到语法错误。有什么想法吗?@spoko。你评论中的例子与我回答中的建议无关。如果这听起来很愚蠢,很抱歉,但是你能扩展你的想法吗?我的意思是,为什么使用像
这样的
而不是
=
会使我的示例变得不相关?反正我有文本类型;然而,
=
并没有给我使用
%
的特权。好吧,我解决了这个问题。您的解决方案和我的示例非常相关,但我的同事编写了我应该更改的代码部分,他通过添加字符串来构建查询,其中的每一个查询都是由“”启动和关闭的。添加额外的一对“A”就成功了。尽管如此,
ltrim
是我最终使用的函数,因此我将此帖子标记为一个解决方案。感谢您的回答,但我不想将值强制转换为整数。我希望他们保持角色的变化。@spoko,他们将保持角色的变化。我只是把它们放在where子句中,这样你就可以比较并得到你想要的。在select语句中,我只指定
*
,这意味着返回所有字段的原样。所以
m.value
将作为varchar返回。你说得对,我的坏朋友。但是,强制转换为整数将不允许我使用像“45%”这样的
,但是您的评论让我想知道,如果我将表达式强制转换为文本(如本例中所示),会发生什么情况:。我要试试看。
select *
from example e
where ltrim(e.value, '0') = '45';
select *
from example e
where e.value = lpad('45', 5, '0');