2016-05-12 2 views
1

Кто-то может мне помочь? У меня есть поле с этой структурой: 2,3,4,5,6,0,1 это день недели, и я должен найти, если сегодня последний день доставки недели, проблема в этом :SQL, Case with Like внутри где

Пример: сегодня это день 3 и со следующим запросом. Я могу выбрать все, что заканчивается с номером 3, но если у меня есть кто-то, у кого есть эта структура: 3,0,1 или 3,1 или 3 , 0 Я их не получаю.

declare @today int 
set @today=DATEPART(dw,GETDATE())-2 
print @today 
select cast (cfv.value as VARCHAR) 
from CompanyFieldvalues cfv 
join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
where cf.name='NextDeliveryDates' and cfv.companyId in(
select cfv.companyId 
from CompanyFieldvalues cfv 
join Companies c on c.companyId=cfv.companyId 
where cfv.value='Retailer' and c.status=1) 
and (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR)) 

Чтобы исправить это, я трудно представить случай, так что мой запрос будет такой:

declare @today int 
set @today=DATEPART(dw,GETDATE())-2 
print @today 
select cast (cfv.value as VARCHAR) 
from CompanyFieldvalues cfv 
join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
where cf.name='NextDeliveryDates' and cfv.companyId in(
select cfv.companyId 
from CompanyFieldvalues cfv 
join Companies c on c.companyId=cfv.companyId 
where cfv.value='Retailer' and c.status=1) 
and (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR)) and case 
     when (@today != 0 or @today!=1) 
     then (cfv.value not like '%,0' or cfv.value not like '%,1') 

Но в этом случае я получаю сообщение об ошибке:

Msg 156 , Уровень 15, Состояние 1, Строка 14 Неверный синтаксис рядом с ключевым словом 'not'.

Я уверен, что я делаю некоторые глупые ошибки, но я не понимаю: S

Некоторые помогают пожалуйста! Большое спасибо

+0

Tag СУБД, много продукции конкретного SQL там ... – jarlh

+0

большое спасибо;) –

+0

Я имею в виду маркировать продукт DBMS вы использование. (Например, SQL Server, или Oracle, или Sybase, или что-то еще.) Тогда ваш вопрос получит лучшее внимание, и вы получите лучшие ответы быстрее! – jarlh

ответ

0

С сазе должно выглядеть примерно так:

declare @today int 
set @today=DATEPART(dw,GETDATE())-2 
print @today 

select cfv.value 
from CompanyFieldvalues cfv 
join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
where cf.name='NextDeliveryDates' and cfv.companyId in(
select cfv.companyId 
from CompanyFieldvalues cfv 
join Companies c on c.companyId=cfv.companyId 
where cfv.value='Retailer' and c.status=1) 

and 

CASE 
    WHEN (@today !=0 or @today!=1) THEN 
     (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR) 
     or cfv.value like '%' + cast (@today as VARCHAR)+',0' 
     or cfv.value like '%' + cast (@today as VARCHAR)+',0,1' 
     or cfv.value like '%' + cast (@today as VARCHAR)+',1') 
    ELSE 
     (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR)) 
END = 1 

OR *************************************

CASE 
    WHEN ((@today !=0 or @today!=1) AND (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR) 
     or cfv.value like '%' + cast (@today as VARCHAR)+',0' 
     or cfv.value like '%' + cast (@today as VARCHAR)+',0,1' 
     or cfv.value like '%' + cast (@today as VARCHAR)+',1')) 
    THEN 1 
    WHEN (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR)) THEN 1 
    ELSE 0 
END = 1 

Но это верно выражение (@Today! = 0 или @Today! = 1) всегда истинно. Может быть, вы должны найти другие Значимые условию

+0

Привет, Патрисия, так много для ответа, нет (@today! = 0 или @today! = 1) не всегда верно, потому что я объявляю свою дату как: set @ today = DATEPART (dw, GETDATE()) - 2 это потому, что в спине у меня есть код C#, который управляет датой по-другому;) Я собираюсь попробовать ваше предложение, и я дам вам знать;) –

+0

Да, это всегда так. Если вы отрицаете это, у вас будет что-то вроде этого: today == 0 И сегодня == 1, что, очевидно, всегда ложно. Проблема заключается не в синтаксисе оператора CASE. Причина, по которой вы не получаете ожидаемого ответа, состоит в том, что логика ошибочна. – Patricia

+0

Привет, Патриция, да, вы правы, я просто попробую: S и как я могу это сделать? но почему сегодня == 0 И сегодня == 1 всегда ошибка? если я имитирую это объявление сегодня int set today = DATEPART (dw, GETDATE()) - 5 Печать сегодня ----- У меня сегодня = 0, так почему это должно быть ложным? как я могу решить эту проблему? ой в любом случае я должен был использовать 2 вариант, который вы мне дали, первый, который я не знаю, почему это давало мне проблемы. В любом случае, я только что опубликовал новый ответ с моим текущим запросом и в чем проблема, когда я имитирую случай 0 –

0

Вы можете заменить оператор CASE, с логическим выражением:

(((@today != 0 or @today!=1) AND (cfv.value not like '%,0' or cfv.value not like '%,1')) OR NOT (@today != 0 or @today!=1)) 

Таким образом, ваш запрос будет:

declare @today int 
set @today=DATEPART(dw,GETDATE())-2 
print @today 
select cast (cfv.value as VARCHAR) from CompanyFieldvalues cfv 
    join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
    where cf.name='NextDeliveryDates' and cfv.companyId in(
     select cfv.companyId 
      from CompanyFieldvalues cfv 
      join Companies c on c.companyId=cfv.companyId 
      where cfv.value='Retailer' and c.status=1) 
      and (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value  like '%' + cast (@today as VARCHAR)) 
      and (((@today != 0 or @today!=1) AND (cfv.value not like '%,0' or cfv.value not like '%,1')) OR NOT (@today != 0 or @today!=1)) 
+0

По общему признанию, вы просто скопировали это из OP, но эта часть всегда верна; '(@today! = 0 или @today! = 1)' * (если @today не равно NULL) *. Кроме того, использование символов '&&', '||' должно быть заменено ключевыми словами 'AND',' OR'. – MatBailie

+0

Он все еще не работает в каждом случае, он работает, если конец значения, например, с 3, текущий день, но не выбирает, когда в БД у меня есть значения 3,0,1. Я собираюсь добавить ответ с более подробной информацией. –

0

UPDATE для Патрисии:

Это мой стол, он имеет только один ряд с этим значением, которые представляют собой последний день доставки человека, проблема заключается в том, что они имеют такую ​​структуру : 2,3,4,5,6,0,1

3,0,1 
0,1 
3,0 
5,6 
5,5 
5 
3 

Мне нужно знать, если один из этого человека есть последний день доставки, как сегодня (0 и 1 являются каждый раз, когда в конце, но на самом деле они не являются последний день доставки, но первый и второй).

Я полагаю, что я должен создать 2 отдельный случай для 0 и 1, но я не получаю их: S Это то, что я на самом деле есть:

declare @today int 
set @today=DATEPART(dw,GETDATE())-2 /*-2 because the date are managed from a c# code so I need in this way to have the day in the format Monday=0, etc*/ 
print @today 
select cfv.value 
from CompanyFieldvalues cfv 
join CompanyFields cf on cf.companyFieldId=cfv.companyFieldId 
where cf.name='NextDeliveryDates' and cfv.companyId in(
select cfv.companyId 
from CompanyFieldvalues cfv 
join Companies c on c.companyId=cfv.companyId 
where cfv.value='Retailer' and c.status=1) 
and 
CASE 
    WHEN ((@today !=0 or @today!=1) AND (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR) 
    or cfv.value like '%' + cast (@today as VARCHAR)+',0' 
    or cfv.value like '%' + cast (@today as VARCHAR)+',0,1' 
    or cfv.value like '%' + cast (@today as VARCHAR)+',1')) 
    then 1 
    WHEN (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR)) THEN 1 
    ELSE 0 
END = 1 

в этот момент, как вы говорите, у меня есть каждый раз, когда это день 0 или день 1. Если это день 0 я должен выбрать только значение = 0, когда в день 1 я должен выбрать, когда значение = 1 или значение = 0,1, так что я думаю, что нужно изменить второе условие:

WHEN (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' + cast (@today as VARCHAR)) THEN 1 

и создать 2 разных, не так ли?

+0

Вы все еще have '(@today! = 0 или @today! = 1)', который всегда *** *** TRUE ... Если '@today = 0', то вы имеете' (0! = 0) ИЛИ (0! = 1) '=>' (FALSE) ИЛИ (TRUE) '=>' TRUE'. Единственный раз, когда это неверно, если '@ today' является' NULL'. – MatBailie

+0

, но почему это всегда так? Я не понимаю: S Я объявил @ today = DATEPART (dw, GETDATE()) - 2, поэтому, когда это понедельник @ сегодня = 0! почему бы не войти в это условие? как я могу это исправить? –

0

Если бы я был вами, и я хорошо понимал, что вы намереваетесь делать, я бы выполнил это как следующее. Я хотел бы определить функцию, которая разбивает строку:

create function dbo.SplitString 
(
    @str nvarchar(max), 
    @separator char(1) 
) 
returns table 
AS 
return (
with tokens(p, a, b) AS (
    select 
     cast(1 as bigint), 
     cast(1 as bigint), 
     charindex(@separator, @str) 
    union all 
    select 
     p + 1, 
     b + 1, 
     charindex(@separator, @str, b + 1) 
    from tokens 
    where b > 0 
) 
select 
    p-1 ItemIndex, 
    substring(
     @str, 
     a, 
     case 
     when b > 0 then b-a 
     ELSE LEN(@str) end) 
    AS Item 
from tokens 
); 

GO 

И тогда я хотел бы использовать следующее условие:

AND where not exists(select * from dbo.SplitString(cfv.value, ',') where CAST(Item AS INT) > @today) 

я тестировал на образце вы мне дали, и она работает. Так что для следующего ввода:

5 
5 
3,4 
5 
5 
5 
3,0,1 
3,0 
5 
3 

Он возвращается: используется

3 
3,0,1 
3,0 
+0

oh perfect, если вы видите мой комментарий, я решил по-другому, но я думаю, что вы более эффективны;) Спасибо, sohhhh –