日期:2014-05-18  浏览次数:20621 次

SQL 范围条件
一个表记录参数范围
类型 参数范围 系统类型(XP,SERVER,VISTA) 价格
3012 TRX≤12 XP单系统 8000.00
3012 12<TRX≤24 XP单系统 2000.00
3012 12<TRX≤24 XP+Vista 9000.00
3012 12<TRX≤24 XP+Server 80022.00
3012 12<TRX≤24 XP+Server+Vista 99853.00


一个表记录的是 参数值
类型 参数 系统类型(XP,SERVER,VISTA) 
3012 50 XP单系统
3012 20 XP+Server+Vista
3012 10 XP+Vista

两个表联合查询,根据2个表:类型=类型,系统类型=系统类型,参数在参数范围内 ,得出相应的价格。
即:
  根据表二得出表一对应的价格。

如何解决??


------解决方案--------------------
简单讲一下思路

select case when CharIndex('<TRX<',参数范围)>0 when Cast(left(参数范围,CharIndex('<',参数范围)-1) as numeric(18,2)+0.01)
when CharIndex('≤TRX≤',参数范围)>0 when Cast(left(参数范围,CharIndex('≤',参数范围)-1)as numeric(18,2))
when CharIndex('<TRX≤',参数范围)>0 when Cast(left(参数范围,CharIndex('<',参数范围)-1)as numeric(18,2)+0.01)
when CharIndex('≤TRX<',参数范围)>0 when Cast(left(参数范围,CharIndex('≤',参数范围)-1)as numeric(18,2))
when CharIndex('TRX',参数范围)=1 when -99999
end as SType,
case when CharIndex('<TRX<',参数范围)>0 when Cast(right(参数范围,CharIndex('<',参数范围,CharIndex('<',参数范围)+1)+1) as numeric(18,2)+0.01)
when CharIndex('≤TRX≤',参数范围)>0 when Cast(right(参数范围,CharIndex('≤',参数范围,,CharIndex('≤',参数范围)+1))+1)as numeric(18,2))
when CharIndex('<TRX≤',参数范围)>0 when Cast(right(参数范围,CharIndex('≤',参数范围)+1)as numeric(18,2)+0.01)
when CharIndex('≤TRX<',参数范围)>0 when Cast(right(参数范围,CharIndex('<',参数范围)+1)as numeric(18,2))
when CharIndex('TRX',参数范围)=1 when when CharIndex('<',参数范围)>0 then Cast(right(参数范围,CharIndex('≤',参数范围)+1)as numeric(18,2)+0.01)
....
end as EType,
... into #tmp
from 表一

select * from 表二 b2,#tmp b1
where b2.类型=b1.类型 and b2.系统类型=b1.系统类型
and b2.参数>=b1.SType and b2.参数<= b1.EType



------解决方案--------------------
没看到还有其他的范围,改了一下
SQL code

SELECT * 
FROM tba AS A INNER JOIN tbb AS B ON A.类型 = B.类型 AND A.系统类型 = B.系统类型 AND 
参数 BETWEEN CASE WHEN CHARINDEX('<TRX',参数范围) > 0 THEN CAST(LEFT(参数范围,CHARINDEX('<TRX',参数范围) - 1) AS INT)
                  WHEN CHARINDEX('≤TRX',参数范围) > 0 THEN  CAST(LEFT(参数范围,CHARINDEX('≤TRX',参数范围) - 1) AS INT)
                  WHEN CHARINDEX('TRX>',参数范围) > 0 THEN CAST(RIGHT(参数范围,LEN(参数范围) - 4) AS INT)
                  WHEN CHARINDEX('TRX≥',参数范围) > 0 THEN CAST(RIGHT(参数范围,LEN(参数范围) - 4) AS INT) 
                  ELSE 参数 END
AND CASE WHEN CHARINDEX('TRX<',参数范围) > 0 THEN  CAST(RIGHT(参数范围,LEN(参数范围) - CHARINDEX('TRX<',参数范围) - 3) AS INT)
               WHEN CHARINDEX('TRX≤',参数范围) > 0 THEN  CAST(RIGHT(参数范围,LEN(参数范围) - CHARINDEX('TRX≤',参数范围) - 3) AS INT)
               ELSE 参数 END

类型    参数范围    系统类型    价格    类型    参数    系统类型
3012    12<TRX≤24    XP+Server+Vista    99853.00    3012    20    XP+Server+Vista
3012    12≤TRX<24    XP+Server+Vista    99853.00    3012    20    XP+Server+Vista
3012    12≤TRX≤24    XP+Server+Vista    99853.00    3012    20    XP+Server+Vista
3012    TRX>12    XP单系统    8000.00    3012    50    XP单系统