如何在sql server中使用where子句之后的case

如何在sql server中使用where子句之后的case,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是我的数据。如果价格为空,我只想显示A类数据 然后显示B类价格。我试过了,但不知道我是怎么表现出来的 资料 运行此查询时,只显示A类数据 select * from tbl1 where category = case when price is null then 'B' else 'A' end 使用左连接和合并()(也可以使用isnull()): coalesce()将按从左到右的顺序返回参数中的第一个非null值 rextester演示: 返回: select a.Category,

这是我的数据。如果价格为空,我只想显示A类数据 然后显示B类价格。我试过了,但不知道我是怎么表现出来的 资料

运行此查询时,只显示A类数据

select * from tbl1
where category = case when price is null then 'B' else 'A' end

使用
左连接和
合并()
(也可以使用
isnull()
):

coalesce()
将按从左到右的顺序返回参数中的第一个非
null

rextester演示:

返回:

select a.Category, a.Item, coalesce(a.Price,b.Price) as Price
from yourtable a
  left join yourtable b
    on a.Item = b.Item
   and b.category = 'B'
where a.category = 'A'
参考:

    • 类似这样的东西

      +----------+-----------+-------+
      | Category |   Item    | Price |
      +----------+-----------+-------+
      | A        | Pen       |    10 |
      | A        | Pencil    |    10 |
      | A        | Note Book |    40 |
      | A        | Bottle    |    80 |
      | A        | Ball      |    50 |
      | A        | Bag       |  1000 |
      +----------+-----------+-------+
      
      `

      输出

      ;WITH cte(category,Item,Price)
      AS
      (
       SELECT 'A','Pen'       ,NULL  UNION ALL
       SELECT 'B','Pen'       ,10    UNION ALL
       SELECT 'A','Pencil'    ,10    UNION ALL
       SELECT 'B','Pencil'    ,8     UNION ALL
       SELECT 'C','Pencil'    ,7     UNION ALL
       SELECT 'A','Note Book' ,40    UNION ALL
       SELECT 'B','Note Book' ,30    UNION ALL
       SELECT 'C','Note Book' ,20    UNION ALL
       SELECT 'A','Bottle'    ,NULL  UNION ALL
       SELECT 'B','Bottle'    ,80    UNION ALL
       SELECT 'A','Ball'      ,50    UNION ALL
       SELECT 'B','Ball'      ,40    UNION ALL
       SELECT 'A','Bag'       ,1000  UNION ALL
       SELECT 'B','Bag'       ,800
       )
       SELECT category,Item,Price From
       (
       SELECT *,ROW_NUMBER()Over(Partition by Price order by Price)seq From
       (
       SELECT o.*  FROM cte i 
       INNER JOIN cte o
       ON o.category=i.category
       WHERE o.category='A' AND o.Price!=i.Price
       )dt
      ) Final
      where Final.seq=1
      
      值“B”的输出

      category    Item    Price
      A         Pencil    10
      A         Note Book 40
      A         Ball      50
      A         Bag       1000
      
      我的理解是,如果某个类别中的某个项目的价格为空,那么它应该从另一个有价格的类别中选取该特定项目


      输出应该是什么样的?这里的问题是,当考虑
      B
      行时,他们试图对
      A
      行进行“推理”。在考虑是否在结果中包含
      B
      行时,他们希望
      price
      列的值来自
      A
      行。这不能用一个简单的
      WHERE
      条件来完成。
      SELECT price
      FROM table
      WHERE
         category = CASE 
                   WHEN price is not null THEN 'A'
                   ELSE 'B'
                  END
      
      ;WITH cte(category,Item,Price)
      AS
      (
       SELECT 'A','Pen'       ,NULL  UNION ALL
       SELECT 'B','Pen'       ,10    UNION ALL
       SELECT 'A','Pencil'    ,10    UNION ALL
       SELECT 'B','Pencil'    ,8     UNION ALL
       SELECT 'C','Pencil'    ,7     UNION ALL
       SELECT 'A','Note Book' ,40    UNION ALL
       SELECT 'B','Note Book' ,30    UNION ALL
       SELECT 'C','Note Book' ,20    UNION ALL
       SELECT 'A','Bottle'    ,NULL  UNION ALL
       SELECT 'B','Bottle'    ,80    UNION ALL
       SELECT 'A','Ball'      ,50    UNION ALL
       SELECT 'B','Ball'      ,40    UNION ALL
       SELECT 'A','Bag'       ,1000  UNION ALL
       SELECT 'B','Bag'       ,800
       )
       SELECT category,Item,Price From
       (
       SELECT *,ROW_NUMBER()Over(Partition by Price order by Price)seq From
       (
       SELECT o.*  FROM cte i 
       INNER JOIN cte o
       ON o.category=i.category
       WHERE o.category='A' AND o.Price!=i.Price
       )dt
      ) Final
      where Final.seq=1
      
      category    Item    Price
      A         Pencil    10
      A         Note Book 40
      A         Ball      50
      A         Bag       1000
      
      category    Item        Price
      --------------------------------
      B           Pencil      8
      B           Pen         10
      B           Note Book   30
      B           Ball        40
      B           Bottle      80
      B           Bag         800
      
      --Filter records having prices
      with CTETable as
      (
      Select distinct category, item, price 
      from tbl1
      where price is not null
      )
      --distinct items
      select * from
      (select category, item, price, ROW_NUMBER() over (Partition by Item order by 
      Category) as RowNo from CTETable)
      as c
      where c.RowNo=1