我有一个整数列,我想查找以特定数字开头的数字。
例如,如果我寻找'123',它们会匹配:
1234567
123456
1234
他们不匹配:
23456
112345
0123445
在进行字符串比较之前,通过将整数转换为字符串来处理任务的唯一方法是什么?
此外,我在数字上使用Postgre regexp_replace(文本,模式,替换),这是非常缓慢且低效的方式。
案例是我有大量的数据来处理这种方式,我正在寻找最经济的方法。
PS。我不是在寻找如何将整数转换为字符串的方法。
答案 0 :(得分:3)
您是否在价值的开头寻找匹配? 您可以创建这样的功能索引:
CREATE INDEX my_index ON mytable(CAST(stuff AS TEXT));
它应该由你的LIKE查询使用,但我没有测试它。
答案 1 :(得分:2)
性能的最佳方法是将它们存储为带有索引的字符串,并使用LIKE'123%'。解决此问题的大多数其他方法可能涉及全表扫描。
如果您不允许更改表格,您可以尝试以下方法,但它并不漂亮:
WHERE col = 123
OR col BETWEEN 1230 AND 1239
OR col BETWEEN 12300 AND 12399
etc...
这也可能导致表扫描。您可以通过将OR转换为多个选择来解决,然后UNION ALL
将它们转换为最终结果。
答案 2 :(得分:2)
作为标准原则(IMHO),当且仅当字段为:
时,数据库设计应使用数字类型如果它是某些其他环境中的号码 - 电话号码,IP地址等 - 将其存储为文本。
这听起来像你的'123'在概念上是一个恰好只包含数字的字符串,所以如果可能的话,我建议改变设计,以便它存储起来。
否则,我无法看到使用它作为数字进行比较的合理方法,因此您需要使用类似
的方式将其转换为字符串。SELECT * FROM Table WHERE CheckVar LIKE '''' + to_char(<num>,'999') + '%'