整数比较为字符串

时间:2010-03-24 11:45:30

标签: sql postgresql comparison

我有一个整数列,我想查找以特定数字开头的数字。

例如,如果我寻找'123',它们会匹配:

1234567
123456
1234

他们不匹配:

23456
112345
0123445

在进行字符串比较之前,通过将整数转换为字符串来处理任务的唯一方法是什么?

此外,我在数字上使用Postgre regexp_replace(文本,模式,替换),这是非常缓慢且低效的方式。

案例是我有大量的数据来处理这种方式,我正在寻找最经济的方法。

PS。我不是在寻找如何将整数转换为字符串的方法。

3 个答案:

答案 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),当且仅当字段为:

时,数据库设计应使用数字类型
  1. 你可以明智地执行数学的数字
  2. 数据库中的参考代码 - 键等
  3. 如果它是某些其他环境中的号码 - 电话号码,IP地址等 - 将其存储为文本。

    这听起来像你的'123'在概念上是一个恰好只包含数字的字符串,所以如果可能的话,我建议改变设计,以便它存储起来。

    否则,我无法看到使用它作为数字进行比较的合理方法,因此您需要使用类似

    的方式将其转换为字符串。
    SELECT * FROM Table WHERE CheckVar LIKE '''' + to_char(<num>,'999') + '%'