sql中IN子句的问题

时间:2014-01-09 12:02:17

标签: sql sql-server-2012

SELECT bm.WinningNumber,bd.BetOnNumber,"WinLossAmount" = 
      CASE            
         WHEN 2 in (2,1) THEN ('WIN')
               END    
FROM BettingMaster bm inner join BettingDetail bd on bm.GameID = bd.GameID
where bd.GameID = 1

这可以作为一个魅力,我在WinLossAmount中得到'WIN'。现在我实际上在列WinningNumber(varchar)中有值2,在列BetOnNumber(varchar)中有值2,1。我重申了这句话

SELECT bm.WinningNumber,bd.BetOnNumber,"WinLossAmount" = 
      CASE            
         WHEN bm.WinningNumber in (bd.BetOnNumber) THEN ('WIN')
               END    
FROM BettingMaster bm inner join BettingDetail bd on bm.GameID = bd.GameID
where bd.GameID = 1

这不起作用。这样不可能吗?!任何帮助?

3 个答案:

答案 0 :(得分:0)

我认为问题在于,在第一个语句中,SQL比较2比1然后比较2比2,所有整数。显然,找到匹配和工作。

在第二种情况下,您将2与字符串“1,2”进行比较,2则不等于“1,2”。在比较varchar之前,您需要将varchar拆分为一系列整数。看看:

Parse comma-separated string to make IN List of strings in the Where clause

这应该会帮助你。

答案 1 :(得分:0)

您不能只使用IN然后指定列名,您需要使用子查询:

SELECT  bm.WinningNumber ,
        bd.BetOnNumber ,
        "WinLossAmount" = CASE WHEN bm.WinningNumber IN (
                                    SELECT  bd.BetOnNumber
                                    FROM    BettingMaster bm
                                            INNER JOIN BettingDetail bd ON bm.GameID = bd.GameID
                                    WHERE   bd.GameID = 1 ) THEN ( 'WIN' )
                          END
FROM    BettingMaster bm
        INNER JOIN BettingDetail bd ON bm.GameID = bd.GameID
WHERE   bd.GameID = 1

答案 2 :(得分:0)

SQL中的IN运算符搜索行集中的值。但在第二个示例中,您尝试在STRING中找到INT值,因此您无法以这种方式使用IN

在大多数SQL系统中,您可以尝试使用以下条件。其中+是MSSQL中的连接运算符(在Oracle ||中,在MySQL CONCAT()中)

WHEN ','+bd.BetOnNumber+',' LIKE '%,'+CAST(bm.WinningNumber AS VARCHAR(10))+',%' 
     THEN ...

同样在MySQL中,您可以使用FIND_IN_SET()功能:

WHEN FIND_IN_SET(bm.WinningNumber,bd.BetOnNumber) THEN ...

PS:两种方式都不能使用索引,所以你不应该在大表上使用它们。