SQL,在where中使用类似的Case
有人能帮我吗? 我有一个具有这种结构的字段:2,3,4,5,6,0,1 它们是一周中的一天,如果今天是一周中的最后一天,我必须找出时间,问题是: 例如,今天是第3天,通过下面的查询,我可以选择所有以数字3结尾的,但是如果我有这样的人:3,0,1,或3,1或3,0,我不知道他们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
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选项