zoukankan      html  css  js  c++  java
  • 627.Swap Salary-(LeetCode之Database篇)

    问题描述


    给出下面的表,名为salary

    id name sex salary
    1 A m 2500
    2 B f 1500
    3 C m 5500
    4 D f 500

    要求执行一个UPDATE语句,将表转换成下面的样子。

    id name sex salary
    1 A f 2500
    2 B m 1500
    3 C f 5500
    4 D m 500

    即m与f交换位置。
     
     

    问题解决


    下面我使用SQL中的case when来解决问题。

    #简单case函数写法
    update salary
    set sex = (case sex 
               when 'm' then 'f'
               else 'm'
               end)
    #case搜索函数写法
    update salary
    set sex = (case  
               when sex = 'm' then 'f'
               else 'm'
               end)

    这两种方式,可以实现相同的功能。简单case函数的写法相对比较简洁,但是和case搜索函数相比,功能方面会有些限制,比如写判定式。

    进入讨论区后发现很多大神还有其它优秀的解决方案。例如:

    UPDATE salary 
    SET sex = IF(sex='m','f','m')

    当表中的某个字段只有两种情况时,可以使用上面的解法。

    还有一种解法真是震惊到我了,那就是采用异或的思路。异或有两条规则是:

    • 两个相同的数异或为0
    • 0与任何数异或还是原数

    所以就有了下面的解法:

    update salary 
    set sex = CHAR(ASCII('f') ^ ASCII('m') ^ ASCII(sex))

    如果sex为‘m’,三个数做异或后结果结果就为‘f’,这个解法真是相当巧妙。

    这里写图片描述

    可以看到这四种方式的运行速度快慢,使用异或的速度是最快的,IF函数的方式速度也还行,不过它只适用于字段只有两种可能的情况。而case when函数是我们最容易想到的,但是其运行速度就稍微的差了点。

  • 相关阅读:
    Poj 3287 Catch That Cow(BFS)
    Poj 1321 棋盘问题(搜索)
    Poj 2488 A Knight's Journey(搜索)
    解决ListView 缓存机制带来的显示不正常问题
    Poj 1631 Bridging signals(二分+DP 解 LIS)
    字符串相似度的几种衡量标准
    linux环回文件
    [转] CentOS---网络配置详解
    Dockerfile学习(二)
    Dockerfile学习(一)
  • 原文地址:https://www.cnblogs.com/KKSJS/p/9622819.html
Copyright © 2011-2022 走看看