为什么我的case语句在我认为它不应该返回NULL值时?

时间:2016-05-11 17:02:02

标签: mysql case-statement

问题在底部,但简而言之,即使链接与我的案例表达相匹配,我正在创建的表格为字段分区提供我的Null值,我似乎无法找到原因。

我正在创建一个表,根据程序中的链接URL分配分部:

create table set_divisions as
  select distinct campaign, offer,
   case
   when upper(link) like '%NORTH%' then 'NORTH'
   when upper(link) like '%SOUTH%' then 'SOUTH'
   when upper(link) like '%EAST%'  then 'EAST'
   when upper(link) like '%WEST%'  then 'WEST'
   ELSE NULL
   END AS DIVISION
   FROM TABLE A;

然后我在Division中获得了很多NULL,所以我试图看看我错过了什么链接,因为它们都应该在Division中有一个值。每个广告系列都有多个与北,南,东或西无关的链接,但每个广告系列也应包含案例陈述中的其中一个链接。

然后我运行以下内容:

select distinct link
from  A, set_divisions S
where A.campaigncode = S.campaigncode
and   A.offercode    = S.offercode
and (
     upper(link) like '%NORTH%'
     or upper(link) like '%SOUTH%'
     or upper(link) like '%EAST%'
     or upper(link) like '%WEST%');

结果会返回包含NORTHSOUTHEASTWEST的链接。

所以我的问题是在创建我的表时我在case表达式中做错了什么,导致它错过了这些链接?

错过链接的例子是(我只使用南方和东方,但所有四个链接都有类似的链接):

http://product.south.com/information/preference
http://sports.east.com/unsubscribe/?email=%%Linkurl9%%

谢谢,这是我的第一篇文章,所以如果我错过了某些内容或者我的代码看起来很糟糕,我会提前道歉。

Reighlo

2 个答案:

答案 0 :(得分:0)

在第二个查询中,您的WHERE子句指定链接必须包含NORTH,SOUTH,EAST或WEST。您的第一个查询不包含类似的WHERE子句。

您可以运行它来查找不包含NORTH,SOUTH,EAST或WEST的链接以进行故障排除:

select distinct link
from  A, set_divisions S
where A.campaigncode = S.campaigncode
and   A.offercode    = S.offercode
and upper(link) not like '%NORTH%'
and upper(link) not like '%SOUTH%'
and upper(link) not like '%EAST%'
and upper(link) not like '%WEST%');

答案 1 :(得分:0)

因此,我运行此表的表有数千万行,正如上面的注释中所提到的,case语句带回了Null,因为即使我的链接url在那里也产生了很多行。我不想排除导致NULL的所有结果,因为有些程序确实应该为null。我发现通过引入所有行的url并对它们进行分组,然后在包含我的case语句的情况下从该子集中选择不同的值,然后再次选择并运行case语句,其中所有剩余的除法仍然为null。然而,这确实带来了重复,所以我不得不使用rownumber()来引入我想要的一切。基本上是为了摆脱已存在真正除法的任何NULL。有一些重复,有不同的部门,但我需要带来这些,因为这是另一个必须要考虑的问题。这是我的代码,如果有更简单的方法,请随时告诉我。不确定它是否重要,但我的桌子在大约5分钟内运行。对不起,如果有任何拼写错误,我必须从我的代码重新创建这里的字段和值,因为我们的客户在隐私问题上真的很重要,虽然这不会放任何东西,但这只是一件令人头疼的事我宁愿不处理

create table set_divisions as       
SELECT DISTINCT CAMPAIGNCODE, OFFERCODE, DIV        
FROM
(
    SELECT DISTINCT CAMPAIGN, OFFER, DIVISION
    ROWNUMBER() OVER
    (PARTITION BY CAMPAIGNCODE, OFFERCODE, ORDER BY DIVISION) AS RN
    FROM (SELECT DISTINCT CAMPAIGN, OFFER, DIVISION)
                case
                when upper(URL) like '%NORTH%'
                AND DIVISION IS NULL THEN 'NORTH'
                when upper(URL) like '%SOUTH%' 
                AND DIVISION IS NULL then 'SOUTH'
                when upper(URL) like '%EAST%'  
                AND DIVISION IS NULL then 'EAST'
                when upper(URL) like '%WEST%'  
                AND DIVISION IS NULL then 'WEST'
                ELSE DIVISION
                END AS DIV      
    FROM
    (
        SELECT DISTINCT CAMPAIGN, OFFER, DIVISION,
        CASE WHEN DIVISION IS NULL THEN LINK_URL
        ELSE NULL 
        END AS URL          
        FROM 
            (
                select campaign, offer, linkurl
                case
                when upper(link) like '%NORTH%' then 'NORTH'
                when upper(link) like '%SOUTH%' then 'SOUTH'
                when upper(link) like '%EAST%'  then 'EAST'
                when upper(link) like '%WEST%'  then 'WEST'
                ELSE NULL
                END AS DIVISION
                FROM TABLE A
                group by campaign, offer, linkurl
                case
                when upper(link) like '%NORTH%' then 'NORTH'
                when upper(link) like '%SOUTH%' then 'SOUTH'
                when upper(link) like '%EAST%'  then 'EAST'
                when upper(link) like '%WEST%'  then 'WEST'
            )               
    )                       
)   
    WHERE RN = 1
    OR (RN >1
        AND DIV IS NOT NULL);