簡體   English   中英

SQL,Case with Like里面的地方

[英]SQL, Case with Like inside of the where

有人可以幫我嗎? 我有一個具有這種結構的字段: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')

但在這種情況下,我收到此錯誤消息:

消息156,級別15,狀態1,行14關鍵字'not'附近的語法不正確。

我確定我犯了一些愚蠢的錯誤,但我不明白: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語句應該看起來像這樣:

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)始終為真。 也許你應該找到另一個有意義的條件

帕特里夏的最新消息:

這是我的表,它只有一行,這個值代表一個人的最后一個交付日,問題是他們有這個結構:2,3,4,5,6,0,1

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

我需要知道這個人中的一個是否像今天一樣有最后一個交貨日(0和1每次都在最后但實際上它們不是最后一個交貨日,而是第一個和第二個交貨日)。

我想我必須為0和1創建2個獨立的案例,但是我沒有得到它們: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個不同的不是嗎?

如果我是你,我理解你打算做什么,我會按照以下方式實現。 我會定義一個分割你的字符串的函數:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM