【问题标题】:Compare string on range in SQL Server比较 SQL Server 中范围内的字符串
【发布时间】:2012-08-14 14:28:45
【问题描述】:

我正在尝试查询一个字符串以匹配数据库中的某个范围。该表有 2 列 FromCodeToCode

以下是示例数据(假设表名为CodeList):

FromCode    ToCode
IV1 0AA     IV9 9ZZ
IV10 0AA    IV28 9ZZ
IV30 0AA    IV32 9ZZ
IV36 0AA    IV36 9ZZ
IV40 0AA    IV49 9ZZ
IV51 0AA    IV56 9ZZ
IV63 0AA    IV63 9ZZ

所以,如果我运行查询

SELECT *
FROM CodeList
WHERE FromCode <= 'IV1 1AB' AND ToCode >= 'IV1 1AB'

它会返回结果

IV1 0AA   IV9 9ZZ 

这是正确的。但是,当我运行这个时:

SELECT *
FROM CodeList
WHERE FromCode <= 'IV2 1AB' AND ToCode >= 'IV2 1AB'

我得到的结果是

IV1 0AA    IV9 9ZZ
IV10 0AA   IV28 9ZZ

因此,对于人类来说,字符串 IV2 2ABIV1 0AA - IV9 9ZZ 内而不是 IV10 0AA - IV28 9ZZ

如果有人能提出更好的方法来搜索数据,我们将不胜感激。另外,我运行它的引擎是 SQL Server 2012。

非常感谢!

【问题讨论】:

  • 分割是从左到右。IV2 (2) 比 iv10 (1) 大。

标签: tsql sql-server-2012


【解决方案1】:
SELECT *
FROM CodeList
WHERE Cast(Substring(Replace(FromCode,' ',''),3,Len(Replace(FromCode,' ',''))-4) as int) <= Cast(Substring(Replace('IV2 1AB',' ',''),3,Len(Replace('IV2 1AB',' ',''))-4) as int)
 AND Cast(Substring(Replace(ToCode,' ',''),3,Len(Replace(ToCode,' ',''))-4) as int) >= Cast(Substring(Replace('IV2 1AB',' ',''),3,Len(Replace('IV2 1AB',' ',''))-4) as int)

将其设置在一个函数中,以使使用更容易

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多