我有一个整型列,我想查找以特定数字开头的数字。
例如,如果我查找‘123’,它们确实匹配:
1234567
123456
1234它们不匹配:
23456
112345
0123445在进行字符串比较之前,将整数转换为字符串是处理该任务的唯一方法吗?
此外,我使用Postgre regexp_replace(文本,模式,替换)对数字,这是非常慢和低效的方式做它。
情况是,我有大量的数据要以这种方式处理,我正在寻找最经济的方式来这样做。
PS。我不是在寻找如何将整数转换为字符串的方法。
发布于 2010-03-24 20:11:49
作为一个标准原则(IMHO),数据库设计应该使用number类型当且仅当字段是:
如果它是其他上下文中的数字--电话号码、IP地址等--则将其存储为文本。
在我看来,你的“123”在概念上是一个恰好只包含数字的字符串,所以如果可能的话,我建议修改一下设计,这样就可以存储它了。
否则,我看不到一种明智的方法来使用它作为数字进行比较,所以您需要使用下面的内容将其动态转换为字符串
SELECT * FROM Table WHERE CheckVar LIKE '''' + to_char(<num>,'999') + '%'发布于 2010-03-24 19:54:00
您是否正在查找值开头的匹配项?您可以像这样创建一个函数索引:
CREATE INDEX my_index ON mytable(CAST(stuff AS TEXT));它应该被你的LIKE查询使用,但是我没有测试它。
发布于 2010-03-24 19:49:01
提高性能的最好方法是将它们存储为字符串,并在列上使用索引,并使用LIKE '123%‘。解决此问题的大多数其他方法可能涉及全表扫描。
如果你不被允许改变表格,你可以尝试下面的方法,但是这样做并不美观:
WHERE col = 123
OR col BETWEEN 1230 AND 1239
OR col BETWEEN 12300 AND 12399
etc...不过,这也可能导致表扫描。您可以通过将OR转换为多个selects来求解,然后对它们执行UNION ALL操作以获得最终结果。
https://stackoverflow.com/questions/2507299
复制相似问题