SQL,在where中使用类似的Case

SQL,在where中使用类似的Case,sql,database,datetime,case,ssms-2012,Sql,Database,Datetime,Case,Ssms 2012,有人能帮我吗? 我有一个具有这种结构的字段:2,3,4,5,6,0,1 它们是一周中的一天,如果今天是一周中的最后一天,我必须找出时间,问题是: 例如,今天是第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 Com

有人能帮我吗? 我有一个具有这种结构的字段:2,3,4,5,6,0,1 它们是一周中的一天,如果今天是一周中的最后一天,我必须找出时间,问题是:

例如,今天是第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行关键字附近的语法不正确 “不是”

我肯定我犯了一些愚蠢的错误,但我不明白:S

请帮忙!
非常感谢

您可以用逻辑表达式替换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))

可以用逻辑表达式替换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))

对于案例陈述,应该如下所示:

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
或*************************************

 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)的表达式总是真的。也许您应该找到另一个有意义的条件,其CASE语句应该如下所示:

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
或*************************************

 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)的表达式总是真的。也许你应该为Patricia找到另一个有意义的条件更新:

这是我的表,它只有一行,其中的值表示一个人的最后交货日,问题是他们有这样的结构:2,3,4,5,6,0,1

3,0,1
0,1
3,0
5,6
5,5
5
3
我需要知道此人中是否有一人的最后一个交货日与今天相同(0和1每次都在最后一天,但实际上它们不是最后一个交货日,而是第一天和第二天)

我想我必须为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
AND where not exists(select * from dbo.SplitString(cfv.value, ',') where    CAST(Item AS INT) > @today )   
创建两个不同的,不是吗?

为Patricia更新:

这是我的表,它只有一行,其中的值表示一个人的最后交货日,问题是他们有这样的结构:2,3,4,5,6,0,1

3,0,1
0,1
3,0
5,6
5,5
5
3
我需要知道此人中是否有一人的最后一个交货日与今天相同(0和1每次都在最后一天,但实际上它们不是最后一个交货日,而是第一天和第二天)

我想我必须为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
AND where not exists(select * from dbo.SplitString(cfv.value, ',') where    CAST(Item AS INT) > @today )   

然后创建两个不同的,不是吗?

如果我是你,并且我很清楚你打算做什么,我将按照以下方式实现。我将定义一个拆分字符串的函数:

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
然后我会使用以下条件:

WHEN (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' +  cast  (@today as VARCHAR)) THEN 1
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

如果我是你,并且我很好地理解了你打算做什么,我将按照以下方式实现这一点。我将定义一个拆分字符串的函数:

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
然后我会使用以下条件:

WHEN (cfv.value like '%,' + cast (@today as VARCHAR) or cfv.value like '%' +  cast  (@today as VARCHAR)) THEN 1
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

标记使用的dbms,这里有很多特定于产品的SQL…我的意思是标记您正在使用的dbms产品。(例如SQL Server、Oracle、Sybase或其他。)这样,您的问题会得到更好的关注,您会更快地得到更好的答案!标记使用的dbms,这里有很多特定于产品的SQL…我的意思是标记您正在使用的dbms产品。(例如SQL Server、Oracle、Sybase或其他。)这样,您的问题会得到更好的关注,您会更快地得到更好的答案!诚然,你只是从作品中抄袭了这一点,但这一部分总是正确的<代码>(@today!=0或@today!=1)(除非@today为空)。此外,符号
&
|
的使用应替换为关键字
。它仍然不能在所有情况下工作,如果值以3结尾,即当天,它就工作,但在数据库中我有值3,0,1时,它不选择。我将添加一个更详细的答案,你刚刚从OP中复制了这个,但这部分总是正确的<代码>(@today!=0或@today!=1)(除非@today为空)。此外,符号
&
|
的使用应替换为关键字
。它仍然不能在所有情况下工作,如果值以3结尾,即当天,它就工作,但在数据库中我有值3,0,1时,它不选择。我将添加一个更详细的答案Shi Patricia,tks对于答案来说太多了,不(@today!=0或@today!=1)并非每次都是真的,因为我将我的日期声明为:set@today=DATEPART(dw,GETDATE())-2这是因为在后面我有一个以不同方式管理日期的C代码;)我将尝试你的建议,并让你知道;)是的,总是这样。如果你否认它,你会得到这样的结果:今天==0,今天==1,这显然是错误的。问题不在于CASE语句的语法。你没有得到预期答案的原因是因为逻辑是错误的。嗨,帕特里夏,是的,你是对的,我只是尝试一下:我该怎么做?但是为什么今天==0和今天==1总是错误的呢?如果我模拟这个declare today int set today=DATEPART(dw,GETDATE())-5 print today-----我有一个today=0,那么为什么应该为false?我如何解决这个问题?哦,无论如何,我必须使用你给我的2选项