如何组合多个参数

uidvcgyl  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(280)

我想在表中创建一个额外的列。其目的是为所有邮政编码介于2900和3199之间或2600和2699之间的行赋予值“omgeving rotterdam”、所有其他邮政编码“nederland”以及所有空单元格为“no postcode”的行。
我尝试了以下代码(但它给出了“omgeving rotterdam in all cells of the added row')

SELECT *
,case 
    when (LEFT(Postcode,4) between 2900 AND 3199 OR 2600 AND 2699) then 'Omgeving Rotterdam'
    when (LEFT(Postcode,4) IS NOT NULL AND NOT between 2900 AND 3199 OR 2600 AND 2699) then 'Nederland'
    else 'Geen Postcode'
end
as 'Komt Uit'
FROM
    a
        LEFT JOIN
    b ON a.ID = b.code
        JOIN
    c ON c.id_E = a.E_ID
iyfamqjs

iyfamqjs1#

这不是答案。只是为了解释:

when (LEFT(Postcode,4) between 2900 AND 3199 OR 2600 AND 2699) then 'Omgeving Rotterdam'

when LEFT(Postcode,4) between 2900 AND 3199
  OR (2600 AND 2699) then 'Omgeving Rotterdam'

2600不是真正的条件,2699也不是。但是mysql需要一些条件将整数转换为布尔值(使0=false,其他数字=true)。所以你有:

when LEFT(Postcode,4) between 2900 AND 3199
  OR (true AND true) then 'Omgeving Rotterdam'

只是

when true then 'Omgeving Rotterdam'

这就是为什么你所有的结果都是“omgeving rotterdam”。
关于:

when (LEFT(Postcode,4) IS NOT NULL AND NOT between 2900 AND 3199 OR 2600 AND 2699) then 'Nederland'

我认为这会引起一个错误。我不知道mysql的解析器是什么 AND <nothing> NOT between 2900 AND 3199 .

cgfeq70w

cgfeq70w2#

大概吧 postcode 是字符串而不是数字。你不应该把你的类型混为一谈。它可能是低效的,有时会导致低效的结果。
在您的情况下,您正在使用 LEFT() ,但对于相同长度的字符串,实际上不需要这样做。因此,这可能会满足您的需求:

select *,
       (case when (Postcode >= '2900' and Postcode < '3200') or
                  (Postcode >= '2600' and Postcode < 
 '2700')
             then 'Omgeving Rotterdam'
             when post is null
             then 'Geen Postcode'
             else 'Nederland'
        end) as Komt_Uit
from a join
     c
     on c.id_E = a.E_ID left join
     b
     on a.ID = b.code;

笔记:
如果 postcode 它的长度是可变的,那么你可能想要 left() ,但您可能希望检查数据。
如果 postcode 是一个数字,使用数字运算或包含对字符串的显式转换。
仅对字符串和日期常量使用单引号。不要使用它们来定义列别名。这最终会导致错误和混乱。
混合时 left join 以及 inner join ,我总是把 inner join 第一。

bmp9r5qi

bmp9r5qi3#

因此,我认为您需要详细说明每个和/或步骤,从而得出以下结果:

SELECT *
,case 
    when (LEFT(Postcode,4) between 2900 AND 3199 OR LEFT(Postcode,4) between 2600 AND 2699) then 'Omgeving Rotterdam'
    when (LEFT(Postcode,4) IS NOT NULL AND LEFT(Postcode,4) NOT between 2900 AND 3199 OR LEFT(Postcode,4) NOT between 2600 AND 2699) then 'Nederland'
    else 'Geen Postcode'
end
as 'Komt Uit'
FROM
    a
        LEFT JOIN
    b ON a.ID = b.code
        JOIN
    c ON c.id_E = a.E_ID

相关问题