在连接时更改一个表中的行值以匹配另一个表中的行值

4xrmg8kj  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(289)

我正在处理一个没有有效规范化的数据库,所以我必须在连接表方面发挥创造性。我有一个表的列名为direction\u or,全名为northwest,还有一个表的列名相同,但缩写为nw,sw,我需要连接这些参数的表。不幸的是,在钥匙上连接是不可能的。
我想知道是否可以使用case-when或其他方法来计算全名,然后使其成为缩写名,然后在一个查询中基于缩写名加入表。
就像我说的,我必须要有创造力,这让我很难堪。
像这样的事,请原谅我的无知。 SELECT * FROM user.directions AS A (somehow change the value of A.direction_or AS newAbb) LEFT JOIN stored.directons AS B ON A.newAbb = B.direction_or 先谢谢你。

gorkyyrv

gorkyyrv1#

您可以创建一个将全名Map为缩写名的查找表,然后在查询中与该表联接。
否则你也可以这样做:

SELECT * FROM
(
    SELECT *,
        CASE
            WHEN direction_or = 'Northwest' THEN 'NW'
            WHEN direction_or = 'Southwest' THEN 'SW'
            -- all other possibilities here
            ELSE ''
        END as direction_or_abb

    FROM user.directions
) a

JOIN stored.directions b
    ON a.direction_or_abb = b.direction_or
flvlnr44

flvlnr442#

如果你想要一个简单而沉重的方式,你可以:
创建一个配对术语表。它应该是相当轻量级的,并且很可能在每次使用它时都会被缓存,但是自从imbriqued select之后它仍然有一个权重。
然后执行以下操作:选择*from user.directions as a left join stored.directons as b on(从states和abrevision中选择desiredvalue,其中state=a.newabb)=b.direction\u或
或者类似的。
解决这个问题的另一种方法是使用枚举。通过创建两个枚举并将相应的字符串Map到等效整数,您可能很容易比较它们。您需要更改表以更改varchar->相应枚举的类型。
请参见:https://dev.mysql.com/doc/refman/8.0/en/enum.html
编辑:在比较枚举时,可能需要做一些尴尬的事情,比如 where A.enumvar+0 = B.enumvar+0 . 尽管如此,您仍然可以尝试不使用它,因为如果代码有效的话,它会更容易阅读。

相关问题