关于案件陈述的问题

时间:2011-08-11 23:46:47

标签: sql case

我正在研究搜索SQL的部分,但我收到错误

我做的是...... 首先,我有一个显示类型表

display_id  |
1           | LED
2           | LCD
3           | PDP

其次,我进行选择查询。

SELECT * FROM Product 
    WHERE
    display_id = 
    CASE @display_type 
        WHEN  1  then 'LED'
        WHEN  2 then 'LCD'
        WHEN  3 then 'PDP'
        END

如果显示ID为1,那么我想显示查询结果的'LED'。

然而,我收到错误

Msg 245, Level 16, State 1, Procedure search_item, Line 18
Conversion failed when converting the varchar value 'LED' to data type int.

我试图使用转换但它不起作用。

有人知道这个问题的解决方案吗?

4 个答案:

答案 0 :(得分:2)

您可以将Case Statement移至Select clause,将@display_type转换为字符串以便显示。

SELECT
  CASE WHEN convert(int, @display_type) = 1 then 'LED'
       WHEN convert(int, @display_type) = 2 then 'LCD'
       WHEN convert(int, @display_type) = 3 then 'PDP'
  END as DisplayType,
  *
FROM
  Product

如果你只是一个具有特定显示类型的产品列表......

SELECT
  *
FROM
  products as P
  inner join MyDisplayTable as DISP on DISP .display_id = P.display_id
WHERE
  DISP.Display_Type = @display_type
  • 假设您的显示表的“名称”列为Display_Type
  • 假设Product表有一个display_id列(希望带有显示表主键的外键)

答案 1 :(得分:2)

您正在WHERE子句中混合数据类型。 display_id似乎是整数,您将其与'LED','LCD'或'PDP进行比较,具体取决于CASE声明的结果。

答案 2 :(得分:1)

如果你有一张可以加入的桌子,你为什么要使用Case?

SELECT Product.*, DisplayType.Type
FROM Product INNER JOIN DisplayType ON Product.display_id=DisplayType.display_id

您没有指定包含“LED”,“LCD”,“PDP”的列的名称,因此如果它不同,则您必须更改该部分。

答案 3 :(得分:0)

SELECT 
   *,
   CASE @display_type 
      WHEN  1  then 'LED'
      WHEN  2 then 'LCD'
      WHEN  3 then 'PDP'
      END as myType
FROM 
   Product
WHERE
   display_id = @display_type