SQL Work从左到右,直到找到Value

时间:2015-03-23 13:20:54

标签: sql sql-server

我一直在摸不着头脑,却找不到一个优雅的'这样做的方式。我正在使用MS SQL Server 2012.

基本上,我获得了一个包含大量项目的表格(ItemsBySeason)。实际项目的长度可以是11(计划实体)或7(样式)字符。

然后我有另一张表(PriceLists),其中包含商品和价格。同样,这些物品都有价格,物品长度为7到11个字符。

我的问题是,是否有一个函数会读取ItemBySeason中的每个项目,并检查PriceLists表中是否有一个匹配长度为11个字符的价格,如果没有,则使用7个字符的价格项目

例如:

Table: Item By Season
Item: AABBCCD1234

Table: PriceLists
Item: AABBCCD1234
Price: 10

所以在这个例子中,我可以为AABBCCD1234检索10

但是,如果发生以下情况:

Table: Item By Season
Item: AABBCCD8888

AABBCCD8888'不匹配在PriceLists中,但下面存在:

Table: PriceLists
Item: AABBCCD
Price: 12

如何检查7长度是否存在并通过12?

非常感谢任何帮助。我发现的唯一工作就是创建一个每个项目的临时表,这个项目在规划实体级别没有价格,并将所有这些项目带到样式级别,然后附加到PriceLists表格,但这看起来很啰嗦。

谢谢,

迈克尔

2 个答案:

答案 0 :(得分:1)

SELECT item_by_season.item
     , planning_entity_prices.price A planning_entity_price
     , style_prices.price As style_price
     , Coalesce(planning_entity_prices.price, style_prices.price) As price
FROM   item_by_season
 LEFT
  JOIN price_lists As planning_entity_prices
    ON planning_entity_prices.item = item_by_season.item
   AND Len(planning_entity_prices.item) = 11
 LEFT
  JOIN price_lists As style_prices
    ON style_prices.item = item_by_season.item
   AND Len(style_prices.item) = 7
;

答案 1 :(得分:0)

这是一种使用相关子查询的方法(或者等效地,它可以使用cross apply)。如果某些东西与7和11长度字符串匹配,则选择11。

select i.*,
       (select top 1 pl.price
        from PriceLists pl
        where pl.itemid = i.itemid or
              left(i.itemid, 7) = pl.itemid
        order by len(pl.itemid) desc
       ) as price
from ItemsBySeason i ;