2014-01-09 2 views
1
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 

Это работает как Очарование, и я получаю «WIN» в WinLossAmount. Теперь у меня есть значение 2 в столбце WinningNumber (varchar) и значение 2,1 в столбце BetOnNumber (varchar). Я повторил заявление какпроблема с пунктом IN в sql

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 

Это не работает. Разве это невозможно? Любая помощь??

+1

bm.WinningNumber in (bd.BetOnNumber) эквивалентно (пример) с 2 в ('2,1'), которое всегда ложно – wxyz

+0

попробуйте t0 напишите '2' в ('2,1'), вы не будете получить какой-либо результат –

+0

Небольшая заметка - если вы обнаружите, что значения, разделенные запятыми, помечены в столбце таблицы базы данных, ваш дизайн, вероятно, неверен. Вероятно, это должно быть в отдельной таблице BetOnNumbers, связанной с вашим идентификатором таблицы BettingMaster (это упростит этот запрос и, вероятно, сэкономит ваше время в долгосрочной перспективе). – Paddy

ответ

0

IN оператора SQL выполняет поиск значения в наборе строк. Но во втором примере вы пытаетесь найти значение INT в STRING, поэтому вы не можете использовать 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: Оба способа не может использовать индексы так вы не должны использовать их на больших таблицах.

+0

Спасибо Valex, это сработало. Просто скопируйте его, чтобы он подумал, почему я это делаю :) ..Пожалуйста, снова просмотрите весь мой проект. Но спасибо за тонну! – user3126947

0

Я считаю, что проблема в том, что в первом утверждении SQL сравнивает 2 к 1, а затем от 2 до 2, все целые числа. Очевидно, что найти матч и работать.

Во втором случае вы сравниваете 2 с строкой «1,2» и 2 не равно «1,2». Вам нужно будет разделить varchar на ряд целых чисел, прежде чем сравнивать их. Посмотрите на:

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

Это должно помочь вам.

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 
+0

Пробовал, не делал !! – user3126947

Смежные вопросы