case 订阅
"CASE"─美国刀具质量的代名词 。累积120年的经验"Case"的名字在刀具业当中是一令人尊重的质量精神象征,1889年开始一个名为"W.R.Case & Son Cutlery Company"在纽约州北部开启了美国刀具业的传奇历史。 展开全文
"CASE"─美国刀具质量的代名词 。累积120年的经验"Case"的名字在刀具业当中是一令人尊重的质量精神象征,1889年开始一个名为"W.R.Case & Son Cutlery Company"在纽约州北部开启了美国刀具业的传奇历史。
信息
类    型
口袋折刀品牌
制刀历史
追溯到120年以前
四个兄弟
William Russell,Jean,John
外文名
CASE
CASE品牌介绍
CASE这个老牌口袋折刀,制刀历史可以追溯到120年以前,自从THERESA CASE与JOHN BROWN FRANCIS CHAMPLIN(JBF CHAMPLIN & SON公司的创始者)结婚后,位于纽约州LITTLE VALLEY的一个小刀具公司就此成立。要好的四个兄弟:William Russell,Jean,John与Andrew Case他们一起帮助他们的姐夫成立公司,这便是后来的Cattaraugus刀具公司。经过2年左右的时间兄弟间开始有了多方经营的想法,因此他们开始经营畜牧,与此同时,CASE兄弟依旧固守于刀具的产业。几年以后,CASE兄弟独自成立了CASE Brothers Cutlery Company,时至今日便是众所皆知的CASE口袋折刀王朝。在开始的第一年,CASE兄弟是以批发商的方式经营公司,这代表了他们只是作代理销售的工作,销售由其他刀厂代工制造并打上CASE商标的刀具,这些代工厂分别为C. Platts & Sons of Gowanda,New York,与Eldred,Pennsylvania。在世纪转变之际,极具企图心的CASE开始准备设立新的厂房,来生产他们自己的刀具。1900年1月22日,于纽约的Little Valley市,他们组成了股份有限公司,股东成员由Jean Case与John Case持有最多的股份,其次为Andrew Case,占有最少股份的则是William Russell,在该年年底刀具工厂终于完成,顺利生产刮须刀传统的口袋折刀。紧接着他们便开始展开强烈的产品广告宣传,CASE兄弟的刮须刀与口袋折刀都是采用手工锻造的方式制作,并且注明了“Tested XX”表示测试过两次的意思,这个源自于CASE兄弟的知名的商标“Tested XX”,一直到今日的W.R. Case & Sons都还继续的再使用,文献记载Jean Case是当时注册这个商标的人,日后CASE兄弟是经由他的授权所使用。这个商标意味着拥有这个印记的刀子都是经过高温热处理后两次回火的方式处理,并且经过实际的硬度测试,至今这个商标依然代表着相同的意思。由于这个商标的强烈卖点,加上了Jean Case与员工辛勤的努力,使得公司于紧接着的几年内迅速成长茁壮。另一个使CASE成功的原因,在于CASE兄弟他们的一个侄子,John Russell Case,一个极为擅长销售的销货高手,Russ Case这个超级销货员,其一年的销售佣金收入都有高过叔叔们经营公司所赚的盈余。就因为Russell Case是一个极具野心的生意人,因此他决定开始开创自己的事业,成立一家由其父亲William Russell Case为名的刀具工厂。由于William Russell Case是CASE兄弟刀厂的一员及股东,这个举动造成了CASE兄弟刀厂相当大的震撼,一个来自于同一血脉的竞争对手,一个名为W.R. Case & Sons的刀具公司。CASE兄弟刀厂一直是坐落于纽约州的Little Valley市,直到1912年所发生的一场大火将其厂房付一之炬。在这个悲剧之后,刀厂便搬到纽约州的Springville,但是很不幸的CASE兄弟刀厂一直无法重振士气,最后终于在1915年结束营业。于此同时,兄弟们将刀厂的设备器具出售,同时亦将“Tested XX”转让给W. R. Case & Sons公司,从此之后W. R. Case & Sons便继承CASE兄弟刀厂的精神制作刀具。W. R. Case & Sons公司于1993年被美国ZIPPO打火机公司并购,由于ZIPPO公司稳定的经营,使得CASE的刀具得以稳定的成长,继续制造价格合理且高品质的刀具。
收起全文
精华内容
下载资源
问答
  • 虽然是专门讲 UML 中的 USE CASE ,但的确是分析系统功能要求、系统外部视图的更好手段。比那复杂笼统的 UML 课程要实用得多。    尤其是作者特地讲述了“活动的分解”,流程图、数据流图与 USE CASE 的差异,没...
  • sql语句中case_SQL中的CASE语句

    千次阅读 2020-07-27 01:00:58
    sql语句中case The case statement in SQL returns a value on a specified condition. We can use a Case statement in select queries along with Where, Order By and Group By clause. It can be used in ...

    sql语句中case

    The case statement in SQL returns a value on a specified condition. We can use a Case statement in select queries along with Where, Order By and Group By clause. It can be used in Insert statement as well. In this article, we would explore CASE statement and its various use cases.

    SQL中的case语句返回指定条件下的值。 我们可以在选择查询中使用Case语句以及Where,Order By和Group By子句。 也可以在Insert语句中使用它。 在本文中,我们将探讨CASE语句及其各种用例。

    Suppose you have a table that stores the ProductID for all products in a mini-store. You want to get Productname for a particular ProductID.

    假设您有一个表,该表在迷你商店中存储所有产品的ProductID。 您想要获取特定ProductID的Productname。

    Look at the following example; We declared a variable @ProductID and specified value 1 for it. In Case statement, we defined conditions. Once a condition is satisfied, its corresponding value is returned.

    看下面的例子; 我们声明了一个变量@ProductID并为其指定了值1。 在案例陈述中,我们定义了条件。 一旦满足条件,将返回其对应的值。

    SQL Case Statement

    Similarly, if we change the condition in a Case statement in SQL, it returns appropriate expression. In the following example, we want to get Product name for ProductID 4.it does not satisfy Case statement condition; therefore, it gave output from Else expression.

    同样,如果我们在SQL中的Case语句中更改条件,则它将返回适当的表达式。 在下面的示例中,我们想要获取ProductID 4的产品名称。它不满足Case语句条件; 因此,它给出了Else表达式的输出。

    SQL Case Statement

    Let us explore a few examples of the Case statement in SQL. Before we proceed, create a sample table and insert few records in it.

    让我们探讨一下SQL中Case语句的一些示例。 在继续之前,创建一个示例表并在其中插入一些记录。

    USE [SQLShackDemo]
    GO
    CREATE TABLE dbo.Employee 
    ( 
    EmployeeID INT IDENTITY PRIMARY KEY, 
    EmployeeName VARCHAR(100) NOT NULL, 
    Gender VARCHAR(1) NOT NULL, 
    StateCode VARCHAR(20) NOT NULL, 
    Salary money NOT NULL,
    ) 
    GO
    USE [SQLShackDemo]
    GO
    SET IDENTITY_INSERT [dbo].[Employee] ON 
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (201, N'Jerome', N'M', N'FL', 83000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (202, N'Ray', N'M', N'AL', 88000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (203, N'Stella', N'F', N'AL', 76000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (204, N'Gilbert', N'M', N'Ar', 42000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (205, N'Edward', N'M', N'FL', 93000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (206, N'Ernest', N'F', N'Al', 64000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (207, N'Jorge', N'F', N'IN', 75000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (208, N'Nicholas', N'F', N'Ge', 71000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (209, N'Lawrence', N'M', N'IN', 95000.0000)
    GO
    INSERT [dbo].[Employee] ([EmployeeID], [EmployeeName], [Gender], [StateCode], [Salary]) VALUES (210, N'Salvador', N'M', N'Co', 75000.0000)
    GO
    SET IDENTITY_INSERT [dbo].[Employee] OFF
    GO
    

    We have following records in Employee table.

    我们在Employee表中有以下记录。

    Demo Table

    不同格式的CASE语句 (Different Formats of CASE Statements )

    一个简单的CASE语句表达式 (A simple CASE statement expression)

    In this format, we evaluate one expression against multiple values. In a simple case statement, it evaluates conditions one by one. Once the condition and expression are matched, it returns the expression mentioned in THEN clause.

    以这种格式,我们针对多个值评估一个表达式。 在一个简单的案例陈述中,它会逐一评估条件。 一旦条件和表达式匹配,它将返回THEN子句中提到的表达式。

    We have following syntax for a case statement in SQL with a simple expression

    对于带有简单表达式SQL中的case语句,我们具有以下语法

    SELECT CASE Expression
    When expression1 Then Result1
    When expression2 Then Result2
    ...
    ELSE Result
    END
    

    Usually, we store abbreviations in a table instead of its full form. For example, in my Employee table, I have used abbreviations in Gender and StateCode. I want to use a Case statement to return values as Male and Female in the output instead of M and F.

    通常,我们将缩写存储在表格中而不是完整形式中。 例如,在我的Employee表中,我在Gender和StateCode中使用了缩写。 我想使用Case语句在输出中返回值MaleFemale而不是MF。

    Execute the following code and notice that we want to evaluate CASE Gender in this query.

    执行以下代码,并注意我们要在此查询中评估CASE Gender

    In the following image, you can notice a difference in output using a Case statement in SQL.

    在下图中,您可以注意到在SQL中使用Case语句的输出有所不同。

    SQL Case Statement example

    CASE语句和比较运算符 (The CASE statement and comparison operator)

    In this format of a CASE statement in SQL, we can evaluate a condition using comparison operators. Once this condition is satisfied, we get an expression from corresponding THEN in the output.

    以这种SQL中CASE语句的格式,我们可以使用比较运算符评估条件。 一旦满足此条件,我们将从输出中的相应THEN中获得一个表达式。

    We can see the following syntax for Case statement with a comparison operator.

    我们可以看到带有比较运算符的Case语句的以下语法。

    CASE
        WHEN ComparsionCondition THEN result
        WHEN ComparsionCondition THEN result
        ELSE other
     END
    

    Suppose we have a salary band for each designation. If employee salary is in between a particular range, we want to get designation using a Case statement.

    假设每个职位都有一个薪水范围。 如果员工薪水在特定范围内,我们希望使用Case语句来指定。

    In the following query, we are using a comparison operator and evaluate an expression.

    在以下查询中,我们使用比较运算符并评估表达式。

    Select EmployeeName,
     CASE
    WHEN Salary >=80000 AND Salary <=100000 THEN 'Director'
    WHEN Salary >=50000 AND Salary <80000 THEN 'Senior Consultant'
    Else 'Director'
    END AS Designation
    from Employee
    

    In the following image you can see, we get designation as per condition specified in CASE statement.

    在下图中,您可以根据CASE语句中指定的条件获得名称。

    SQL Case Statement example

    带子句的案例陈述 (Case Statement with Order by clause)

    We can use Case statement with order by clause as well. In SQL, we use Order By clause to sort results in ascending or descending order.

    我们也可以将Case语句与order by子句一起使用。 在SQL中,我们使用Order By子句对结果进行升序或降序排序。

    Suppose in a further example; we want to sort result in the following method.

    再假设一个例子。 我们想用以下方法对结果进行排序。

    1. For Female employee, employee salaries should come in descending order

      对于女员工,员工工资应按降序排列
    2. For Male employee, we should get employee salaries in ascending order

      对于男性员工,我们应该按升序获得员工薪水

    We can define this condition with a combination of Order by and Case statement. In the following query, you can see we specified Order By and Case together. We defined sort conditions in case expression.

    我们可以使用Order by和Case语句的组合来定义此条件。 在以下查询中,您可以看到我们同时指定了Order By和Case。 我们在case表达式中定义了排序条件。

    Select EmployeeName,Gender,Salary
     from Employee
     ORDER BY  CASE Gender
    WHEN 'F' THEN Salary End DESC,
    Case WHEN Gender='M' THEN Salary  
    END
    

    In the output, we have satisfied our sort requirement in ascending or descending order

    在输出中,我们满足了升序或降序的排序要求

    • For Female employee, salary is appearing in descending order

      对于女雇员,薪水以降序显示

    SQL Case Statement in Order By clause
    • For Male employee, salary is appearing in ascending order

      对于男性员工,薪水以升序显示

    SQL Case Statement in Order By clause

    带Group by子句SQL中的Case语句 (Case Statement in SQL with Group by clause)

    We can use a Case statement with Group By clause as well. Suppose we want to group employees based on their salary. We further want to calculate the minimum and maximum salary for a particular range of employees.

    我们也可以将Case语句与Group By子句一起使用。 假设我们要根据员工的薪水进行分组。 我们还想计算特定范围员工的最低和最高薪水。

    In the following query, you can see that we have Group By clause and it contains i with the condition to get the required output.

    在下面的查询中,您可以看到我们有Group By子句,它包含带有条件的i以获得所需的输出。

    Select 
     CASE
    WHEN Salary >=80000 AND Salary <=100000 THEN 'Director'
    WHEN Salary >=50000 AND Salary <80000 THEN 'Senior Consultant'
    Else 'Director'
    END AS Designation,
    Min(salary) as MinimumSalary,
    Max(Salary) as MaximumSalary
    from Employee
    Group By
    CASE
    WHEN Salary >=80000 AND Salary <=100000 THEN 'Director'
    WHEN Salary >=50000 AND Salary <80000 THEN 'Senior Consultant'
    Else 'Director'
    END
    

    We have following output of this query. In this output, we get minimum and maximum salary for a particular designation.

    我们有此查询的以下输出。 在此输出中,我们获得特定指定的最低和最高薪水。

    SQL Case Statement in Group By clause

    用CASE语句更新语句 (Update statement with a CASE statement)

    We can use a Case statement in SQL with update DML as well. Suppose we want to update Statecode of employees based on Case statement conditions.

    我们也可以在带有更新DMLSQL中使用Case语句。 假设我们要根据Case语句条件更新员工的Statecode

    In the following code, we are updating statecode with the following condition.

    在以下代码中,我们将使用以下条件更新状态码。

    • AR, then update to AR,则更新为FL FL
    • GE, then update toGE,则更新为 AL AL
    • For all other statecodes update value to IN

      对于所有其他状态码,将值更新为IN

    Execute the following update command to fulfil our requirement using a Case statement.

    使用Case语句执行以下update命令来满足我们的要求。

    UPDATE employee 
    SET StateCode  = CASE StateCode
     WHEN 'Ar' THEN 'FL' 
     WHEN 'GE' THEN 'AL' 
      ELSE  'IN' 
     END
    

    In the following output, you can see old Statcode (left-hand side) and updated Statecode for the employees based on our conditions in the Case statement.

    在以下输出中,您可以在Case语句中根据我们的条件查看雇员的旧Statcode(左侧)和更新的Statecode。

    SQL Case Statement in Update statement

    带CASE语句的插入语句 (Insert statement with CASE statement)

    We can insert data into SQL tables as well with the help of Case statement in SQL. Suppose we have an application that inserts data into Employees table. We get the following values for gender.

    我们也可以借助SQL中的Case语句将数据插入SQL表中。 假设我们有一个将数据插入到Employees表中的应用程序。 我们得到以下性别值。

    Value

    Description

    Required value in Employee table

    0

    Male Employee

    M

    1

    Female Employee

    F

    描述

    员工表中的必需值

    0

    男员工

    中号

    1个

    女员工

    F

    We do not want to insert value 0 and 1 for Male and Female employees. We need to insert the required values M and F for employee gender.

    我们不想为男性和女性员工插入值0和1。 我们需要为员工性别插入所需的值M和F。

    In the following query, we specified variables to store column values. In the insert statement, you can we are using a Case statement to define corresponding value to insert in the employee table. In the Case statement, it checks for the required values and inserts values from THEN expression in the table.

    在以下查询中,我们指定了用于存储列值的变量。 在insert语句中,您可以使用Case语句定义要插入到employee表中的相应值。 在Case语句中,它将检查所需的值,并将THEN表达式中的值插入表中。

    Declare @EmployeeName varchar(100)
    Declare @Gender int
    Declare @Statecode char(2)
    Declare @salary money
    Set @EmployeeName='Raj'
    Set @Gender=0
    Set @Statecode='FL'
    set @salary=52000
     
    Insert into employee
    values 
    (@EmployeeName,
    CASE @Gender
    WHEN 0 THEN 'M'
    WHEN 1 THEN 'F'
    end,
    @Statecode,
    @salary)
    

    In the following screenshot, we can see newly inserted row contains Gender M instead of value 0.

    在以下屏幕截图中,我们可以看到新插入的行包含Gender M而不是值0。

    SQL Case Statement in Insert clause

    案例陈述限制 (Case Statement limitations)

    • We cannot control the execution flow of stored procedures, functions using a Case statement in SQL

      我们无法使用SQL中的Case语句来控制存储过程,函数的执行流程
    • We can have multiple conditions in Case statement; however, it works in a sequential model. If one condition is satisfied, it stops checking further conditions

      Case语句中可以有多个条件; 但是,它可以在顺序模型中工作。 如果满足一个条件,它将停止检查其他条件
    • We cannot use a Case statement for checking NULL values in a table

      我们不能使用Case语句检查表中的NULL值

    结论 (Conclusion)

    The Case statement in SQL provides flexibility in writing t-SQL for DDL and DML queries. It also adds versatility to SQL Server queries. You should practice Case statement in your queries.

    SQL中的Case语句为编写DDL和DML查询的t-SQL提供了灵活性。 它还为SQL Server查询增加了多功能性。 您应该在查询中练习案例陈述。

    翻译自: https://www.sqlshack.com/case-statement-in-sql/

    sql语句中case

    展开全文
  • Case具有两种格式:简单Case函数和Case搜索函数。 一:简单Case函数 case sex when '1' then '男' when '2' then '女' else '其他' end 二:Case搜索函数 case when sex = '1' then '男' when sex = '2' ...

    Case具有两种格式:简单Case函数Case搜索函数
    一:简单Case函数

    case sex
        when '1' then '男'
        when '2' then '女'
        else '其他' end
    

    二:Case搜索函数

    case 
        when sex = '1' then '男' 
        when sex = '2' then '女' 
        else '其他' end
    

    这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
    – 比如说,下面这段sql,你永远无法得到“第二类”这个结果

    case 
        when col_1 in ( 'a', 'b') then '第一类' 
        when col_1 in ('a')  then '第二类' 
        else'其他' end
    

    下面我们来看一下,使用Case函数都能做些什么事情。

    一,已知数据按照另外一种方式进行分组

    分析,有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为主键:Primary Key)
    在这里插入图片描述
    需求:根据这个国家人口数据,统计亚洲和北美洲的人口数量。
    应该得到下面这个结果:
    在这里插入图片描述
    解决这个问题,你会怎么做?生成一个带有洲Code的View是一个解决方法,但是这样很难动态的改变统计的方式。如果使用Case函数,SQL代码如下:

    select case country
                when '中国' then '亚洲' 
                when '印度' then '亚洲' 
                when '日本' then '亚洲' 
                when '美国' then '北美洲'
                when '加拿大' then '北美洲' 
                when '墨西哥' then '北美洲' 
                else '其他' end as, -- 起别名
                sum(population) as 人口 -- 起别名
    from table_a 
    group by
        (case country 
            when '中国' then '亚洲' 
            when '印度' then '亚洲'
            when '日本' then '亚洲' 
            when '美国' then '北美洲' 
            when '加拿大' then '北美洲' 
            when '墨西哥' then '北美洲' 
            else '其他' end); 
    

    同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。
    SQL代码如下:

    select 
        case 
            when salary <= 500 then '1' 
            when salary > 500 and salary <= 600  then '2' 
            when salary > 600 and salary <= 800  then '3' 
            when salary > 800 and salary <= 1000 then '4' 
            else null end as salary_class, -- 起别名
        count(*)
    from table_a 
    group by 
        (case when salary <= 500 then '1' 
        when salary > 500 and salary <= 600  then '2' 
        when salary > 600 and salary <= 800  then '3' 
        when salary > 800 and salary <= 1000 then '4' 
        else null end); 
    

    结果显示:
    在这里插入图片描述

    二,用一个SQL语句完成不同条件的分组

    有如下数据:
    在这里插入图片描述
    按照国家和性别进行分组,得出结果如下:
    在这里插入图片描述
    普通情况下,用UNION(并集)也可以实现用一条语句进行查询。但是那样增加消耗(两个Select部分),而且SQL语句会比较长。下面是一个是用Case函数来完成这个功能的例子:

    select country, 
            sum(case when sex='1' then population else 0 end) as,  --男性人口 
            sum(case when sex='2' then population else 0 end) as--女性人口
    from table_a
    group by country; 
    

    这样我们使用Select,完成对二维表的输出形式,充分显示了Case函数的强大。

    三,在Check中使用Case函数

    在Check中使用Case函数在很多情况下都是非常不错的解决方法。可能有很多人根本就不用Check,那么我建议你在看过下面的例子之后也尝试一下在SQL中使用Check。
    下面我们来举个例子:
    公司A,这个公司有个规定,女职员的工资必须高于1000块。如果用Check和Case来表现的话,如下所示:

    then 1 else 0 end  else 1 end = 1 ) 
    如果单纯使用check: 
    constraint check_salary check  ( sex = '2' and salary > 1000 )  女职员的条件倒是符合了,男职员就无法输入了。 
    

    四,根据条件有选择的update

    例,有如下更新条件
    1.工资5000以上的职员,工资减少10%
    2.工资在2000到4600之间的职员,工资增加15%
    很容易考虑的是选择执行两次update语句,如下所示
    – 条件1

    update personnel
    set salary = salary * 0.9 
    where salary >= 5000; 
    

    – 条件2

    update personnel 
    set salary = salary * 1.15 
    where salary >= 2000 and salary < 4600;
    

    但是事情没有想象得那么简单,问题:假设有个人工资5000块。首先,按照条件1,工资减少10%,变成工资4500。接下来运行第二个SQL时候,因为这个人的工资是4500在2000到4600的范围之内,需增加15%,最后这个人的工资结果是5175,不但没有减少,反而增加了。如果要是反过来执行,那么工资4600的人相反会变成减少工资。暂且不管这个规章是多么荒诞,如果想要一个sql语句实现这个功能的话,我们就需要用到Case函数。代码如下:

    // 说明:库表:personnel中的每一行数据都会被更新
    update personnel 
    set salary = (case 
                    when salary >= 5000 then salary * 0.9 
                    when salary >= 2000 and salary < 4600 then salary * 1.15 
                    else salary end)
    

    这里要注意一点,最后一行的else salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成null,那可就大事不妙了。
    注意:在Case函数中Else部分的默认值是null,这点是需要注意的地方。
    这种方法还可以在很多地方使用,比如说变更主键这种累活。
    一般情况下,要想把两条数据的Primary key,a和b交换,需要经过临时存储,拷贝,读回数据的三个过程,要是使用Case函数的话,一切都变得简单多了。

    p_keycol_1col_2
    a1张三
    b2李四
    c3王五

    假设有如上数据,需要把主键a和b相互交换。
    用Case函数来实现的话,代码如下:

    update sometable 
    set p_key = (case 
                     when p_key = 'a' then 'b' 
                     when p_key = 'b' then 'a'
                     else p_key end)
    where p_key in ('a', 'b'); 
    

    同样的也可以用来交换两个unique key。
    需要注意的是,如果有需要交换主键的情况发生,多半是当初对这个表的设计进行得不够到位,建议检查表的设计是否妥当。

    五,两个表数据是否一致的检查

    Case函数不同于DECODE函数。在Case函数中,可以使用:between, like, is null, in, exists等等。比如说使用in, exists,可以进行子查询,从而实现更多的功能。
    下面具个例子来说明,有两个表:tbl_A,tbl_B,两个表中都有keyCol列。现在我们对两个表进行比较,tbl_A中的keyCol列的数据如果在tbl_B的keyCol列的数据中可以找到,返回结果’Matched’,如果没有找到,返回结果’Unmatched’。
    要实现下面这个功能,可以使用下面两条语句
    – 使用in的时候:

    select keycol, case 
                        when keycol in (select keycol from tbl_b) then 'matched' 
                        else 'unmatched' end as label 
    from tbl_a; 
    

    – 使用exists的时候:

    select keycol, case 
                        when exists (select * from tbl_b where tbl_a.keycol = tbl_b.keycol) then 'matched' 
                        else 'unmatched' end as label 
    from tbl_a; 
    

    使用in和exists的结果是相同的。也可以使用not in和not exists,但是这个时候要注意null的情况。

    六,在Case函数中使用合计函数

    假设有下面一个表:

    学号(std_id)课程ID(class_id)课程名(class_name)主修flag(main_class_flg)
    1001经济学Y
    1002历史学N
    2002历史学N
    2003考古学Y
    2004计算机N
    3004计算机N
    4005化学N
    5006数学N

    有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生,要选择一门课程作为主修,主修flag里面写入Y。只选择一门课程的学生,主修flag为N(实际上要是写入Y的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。
    现在我们要按照下面两个条件对这个表进行查询:
    1,只选修一门课程的人,返回那门课程的ID
    2,选修多门课程的人,返回所选的主课程ID
    简单的想法就是,执行两条不同的SQL语句进行查询。
    –条件1:只选择了一门课程的学生

    select std_id, max(class_id) as main_class 
    from studentclass 
    group by std_id 
    having count(*) = 1;
    

    执行结果1:

    std_idmain_class
    3004
    4005
    5006

    –条件2:选择多门课程的学生

    select std_id, class_id as main_class 
    from studentclass 
    where main_class_flg = 'Y';
    

    执行结果2:

    std_idmain_class
    1001
    2003

    如果使用Case函数,我们只要一条SQL语句就可以解决问题,具体如下所示:

    select std_id, case
                      when count(*) = 1 then max(class_id)
                      else max(case 
                                  when main_class_flg = 'y' then class_id 
                                  else null end) 
                      end as main_class 
    from studentclass 
    group by std_id; 
    

    运行结果:

    std_idmain_class
    1001
    2003
    3004
    4005
    5006

    通过在Case函数中嵌套Case函数,在合计函数中使用Case函数等方法,我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。
    最后提醒一下使用Case函数的新手注意不要犯下面的错误:

    // 错误的写法
    case col_1 
            when 1 then 'right' 
            when null then 'wrong' 
    end 
    

    在这个语句中when null这一行总是返回unknown,所以永远不会出现wrong的情况。因为这句实际表达的意思是:when col_1 = null,这是一个错误的用法,这个时候我们应该选择用:when col_1 is null。

    七、小结

    select与case结合使用最大的好处有两点:一是在显示查询结果时可以灵活的组织格式,二是有效避免了多次对同一个表或几个表的访问。
    下面举个简单的例子来说明。
    例如表:students(id, name ,birthday, sex, grade), – sex:男女标志(1:男,2:女),-- grade年级。要求按每个年级统计男生和女生的数量各是多少,统计结果的表头为:年级,男生数量,女生数量。如果不用select case when,为了将男女数量并列显示,统计起来非常麻烦,先确定年级信息,再根据年级取男生数和女生数,而且很容易出错。
    用select case when写法如下:
    结论:
    1,count(1)与count(*)得到的结果一致,包含null值。
    2,count(字段)不计算null值
    3,count(null)结果恒为0

    // 原理:count(arg)
    // 对于一行来说,若括号内的参数arg的值若不是null,则count++,
    // 否则对该行不予计数。
    select grade, count(case 
                            when sex = 1 then 1  // 这里可以是不为null的任意数字
                            else null end) as 男生数量,
                  count(case 
                            when sex = 2 then 1  // 这里可以是不为null的任意数字
                            else null end) as 女生数量
    from students
    group by grade;
    

    OR

    select grade, sum(case 
                          when sex = 1 then 1  // 这里只能是1
                          else 0 end) as 男生数量,
                  sum(case
                          when sex = 2 then 1  // 这里只能是1
                          else 0 end) as 女生数量
    from students
    group by grade;
    

    count函数:count(arg)的底层原理:
    count(*)流程(于sub_select函数中)
    上层的流程与代码是比较简单的,集中在 sub_select 函数中,其中 2 类函数分别对应于前面”执行框架”部分所述的 2 个步骤 – 读取、计数。先给出结论如下:
    (1)读取一行:从相对顶层的 sub_select 函数经过一番调用,最终所有分支将调用到 row_search_mvcc 函数中,该函数就是用于从 InnoDB 存储引擎所存储的 B±tree 结构中读取一行到内存中的一个 buf (uchar * ) 中,待后续处理使用。
    (2)计数一行: 代码层面,将会在 evaluate_join_record 函数中对所读取的行进行评估,看其是否应当计入 count 中 (即是否要count++)。
    简单来说,count(arg)本身为 MySQL 的函数操作,对于一行来说,若括号内的参数arg的值若不是null,则count++,否则对该行不予计数。

    原文链接:http://www.seotest.cn/jishu/28219.html

    展开全文
  • sqlserver CASE WHEN语句示例

    千次阅读 2019-03-28 10:50:03
    简单CASE WHEN 语句 case when 回复确认=’’ then ‘未完成’ when ...单条件CASE WHEN 语句 CASE WHEN 采购合同审批表.采购科是否 ='否' THEN '终止' WHEN 采购合同审批表.部门经理是否 ='否' THEN '终止' ...

    简单CASE WHEN 语句 case when 回复确认=’’ then ‘未完成’ when 回复确认=‘5’ then ‘完成’ end as 状态,

    单条件CASE WHEN 语句

        CASE
            WHEN 采购合同审批表.采购科是否 ='否'  THEN  '终止'
            WHEN 采购合同审批表.部门经理是否 ='否'  THEN  '终止'
            WHEN 采购合同审批表.部门经理是否 ='否'  THEN  '终止'
            WHEN 采购合同审批表.管控部门是否 ='否'  THEN  '终止'
            WHEN 采购合同审批表.律师是否 ='否'  THEN  '终止'
            WHEN 采购合同审批表.财务部是否 ='否'  THEN  '终止'
            WHEN 采购合同审批表.财务总监是否 ='否'  THEN  '终止'
            WHEN 采购合同审批表.总经理是否 ='否'  THEN  '终止'
            WHEN 采购合同审批表.总经理是否 ='是'  THEN  '完成'
            ELSE '审批中'
    
        END AS 审批状态
    

    复杂CASE WHEN 语句

    CASE
                WHEN 总分平均值<=50
                AND 否决提案1+否决提案2+否决提案3+否决提案4+否决提案5+否决提案6+isnull(否决提案7,
                0) > 3
                AND 评委签名1 is not null
                AND 评委签名2 is not null
                AND 评委签名3 is not null
                AND 评委签名4 is not null
                AND 评委签名5 is not null
                AND 评委签名6 is not null     THEN 'D'
                WHEN 总分平均值>50
                AND 总分平均值<=70
                AND 否决提案1+否决提案2+否决提案3+否决提案4+否决提案5+否决提案6+isnull(否决提案7,
                0) > 3
                AND 评委签名1 is not null
                AND 评委签名2 is not null
                AND 评委签名3 is not null
                AND 评委签名4 is not null
                AND 评委签名5 is not null
                AND 评委签名6 is not null     THEN 'C'
                WHEN 总分平均值>70
                AND 总分平均值<=80
                AND 否决提案1+否决提案2+否决提案3+否决提案4+否决提案5+否决提案6 +isnull(否决提案7,
                0)> 3
                AND 评委签名1 is not null
                AND 评委签名2 is not null
                AND 评委签名3 is not null
                AND 评委签名4 is not null
                AND 评委签名5 is not null
                AND 评委签名6 is not null     THEN 'B'
                WHEN 总分平均值>80
                AND 否决提案1+否决提案2+否决提案3+否决提案4+否决提案5+否决提案6 +isnull(否决提案7,
                0)> 3
                AND 评委签名1 is not null
                AND 评委签名2 is not null
                AND 评委签名3 is not null
                AND 评委签名4 is not null
                AND 评委签名5 is not null
                AND 评委签名6 is not null     THEN 'A'
                when 否决提案1+否决提案2+否决提案3+否决提案4+否决提案5+否决提案6+isnull(否决提案7,
                0)  <= 3     then ''
            END AS 奖励等级,
            CASE
                WHEN  评委签名1 is not null
                AND 评委签名2 is not null
                AND 评委签名3 is not null
                AND 评委签名4 is not null
                AND 评委签名5 is not null
                AND 评委签名6 is not null
                AND 否决提案1+否决提案2+否决提案3+否决提案4+否决提案5+否决提案6+isnull(否决提案7,
                0)> 3 THEN '提案通过'
                WHEN  否决提案1+否决提案2+否决提案3+否决提案4+否决提案5+否决提案6+isnull(否决提案7,
                0)  <= 3 THEN '提案否决'
                when 改善专员验证是否 ='否'
                and 改善专员验证 is not null      then '提案否决'
                ELSE '评审中'
            END AS 评审状态
    
    展开全文
  • C语言switch case语句详解

    万次阅读 多人点赞 2020-02-22 10:36:58
    当分支比较少的时候我们使用if else语句解决,当分支比较多的时候,我们要使用switch case语句解决,针对分支的复杂性选择合适的程序解决。 当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对...

    当分支比较少的时候我们使用if else语句解决,当分支比较多的时候,我们要使用switch case语句解决,针对分支的复杂性选择合适的程序解决。

    当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。例如,输入一个整数,输出该整数对应的星期几的英文表示:

    #include <stdio.h>
    int main(){
        int a;
        printf("Input integer number:");
        scanf("%d",&a);
        if(a==1){
            printf("Monday\n");
        }else if(a==2){
            printf("Tuesday\n");
        }else if(a==3){
            printf("Wednesday\n");
        }else if(a==4){
            printf("Thursday\n");
        }else if(a==5){
            printf("Friday\n");
        }else if(a==6){
            printf("Saturday\n");
        }else if(a==7){
            printf("Sunday\n");
        }else{
            printf("error\n");
        }
        return 0;
    }
    

    运行结果:

    Input integer number:3↙
    Wednesday
    

    对于上述情况,在实际开发中一般使用 switch 语句代替,请看下面的代码:

    #include <stdio.h>
    int main(){
        int a;
        printf("Input integer number:");
        scanf("%d",&a);
        switch(a){
            case 1: printf("Monday\n"); break;
            case 2: printf("Tuesday\n"); break;
            case 3: printf("Wednesday\n"); break;
            case 4: printf("Thursday\n"); break;
            case 5: printf("Friday\n"); break;
            case 6: printf("Saturday\n"); break;
            case 7: printf("Sunday\n"); break;
            default:printf("error\n"); break;
        }
        return 0;
    }
    

    运行结果:

    Input integer number:4↙
    Thursday
    

    switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分枝的 if else 语句,基本格式如下:

    switch(表达式){
        case 整型数值1: 语句 1;
        case 整型数值2: 语句 2;
        ......
        case 整型数值n: 语句 n;
        default: 语句 n+1;
    }
    

    执行过程:
    1 . 首先计算“表达式”的值,假设为 m。

    2 . 从第一个 case 开始,比较“整型数值1”和 m,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。

    3 . 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。

    4 . 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。

    注意,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句。例如:

    #include <stdio.h>
    int main(){
        int a;
        printf("Input integer number:");
        scanf("%d",&a);
        switch(a){
            case 1: printf("Monday\n");
            case 2: printf("Tuesday\n");
            case 3: printf("Wednesday\n");
            case 4: printf("Thursday\n");
            case 5: printf("Friday\n");
            case 6: printf("Saturday\n");
            case 7: printf("Sunday\n");
            default:printf("error\n");
        }
        return 0;
    }
    

    运行结果:

    Input integer number:4↙
    Thursday
    Friday
    Saturday
    Sunday
    error
    

    输入4,发现和第四个分支匹配成功,于是就执行第四个分支以及后面的所有分支。这显然不是我们想要的结果,我们希望只执行第四个分支,而跳过后面的其他分支。为了达到这个目标,必须要在每个分支最后添加break;语句。

    break 是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。

    使用 break 修改上面的代码:

    #include <stdio.h>
    int main(){
        int a;
        printf("Input integer number:");
        scanf("%d",&a);
        switch(a){
            case 1: printf("Monday\n"); break;
            case 2: printf("Tuesday\n"); break;
            case 3: printf("Wednesday\n"); break;
            case 4: printf("Thursday\n"); break;
            case 5: printf("Friday\n"); break;
            case 6: printf("Saturday\n"); break;
            case 7: printf("Sunday\n"); break;
            default:printf("error\n"); break;
        }
        return 0;
    }
    

    运行结果:

    Input integer number:4↙
    Thursday
    
    

    由于 default 是最后一个分支,匹配后不会再执行其他分支,所以也可以不添加break;语句。

    最后需要说明的两点是:
    1 . case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。请看下面的例子:

    case 10: printf("..."); break;  //正确
    case 8+9: printf("..."); break;  //正确
    case 'A': printf("..."); break;  //正确,字符和整数可以相互转换
    case 'A'+19: printf("..."); break;  //正确,字符和整数可以相互转换
    case 9.5: printf("..."); break;  //错误,不能为小数
    case a: printf("..."); break;    //错误,不能包含变量
    case a+10: printf("..."); break;  //错误,不能包含变量
    

    2 . default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。

    如果感觉不错的话请点赞哟!!!

    展开全文
  • CASE WHEN 及 SELECT CASE WHEN的用法

    万次阅读 多人点赞 2018-08-26 19:14:59
    Case具有两种格式。简单Case函数和Case搜索函数。 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END   --Case搜索函数  CASE WHEN sex = '1' THEN '男'  ...
  • 本文详细介绍了“full_case parallel_case”指令的效果,并包含使用这些开关推断出的有缺陷和低效逻辑的示例。 本文还给出了指导方针正确使用这些指令。
  • scala之case class 和case object

    千次阅读 2018-07-13 17:06:18
    首先我们我们对case class 和case object类型对象进行反编译首先来编译 case class,有如下编译内容:case class Person(age:Int,name:String)它会产生两个文件如下:Person.class的编译内容如下:import scala....
  • case语句检查给定的表达式是否与列表中的其他表达式之一相匹配,并据此进行分支。它通常用于实现一个多路复用器。
  • Verilog中Case语句

    万次阅读 多人点赞 2020-06-22 09:59:50
    case
  • Verilog中关于case语句的优先级

    千次阅读 2020-01-05 21:16:18
    对于这样的组合逻辑电路 always@(X) case(X) X1: X2: …… endcase 如果分支项包含变量X的所有取值情况,并且互相不重复,那么这样的情况,其实没有必要使用综合指令。 (一)“//synthesis parallel_case” 有一些...
  • SQL语句Case When Then多条件判断

    千次阅读 2019-11-22 09:43:20
    总结记录: SQL片段如下 CASE WHEN col_1 IN ( 'a', 'b') THEN '一类' ...注:case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略,假设col_1 为a,则执行结果为:一类。后续符合的分支被忽略。 ...
  • 数据库中case when 的用法

    千次阅读 2019-05-15 15:15:36
    CASE WHEN 及 SELECT CASE WHEN的用法 Case具有两种格式。简单Case函数和Case搜索函数。 1.简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END 2.Case搜索函数 CASE WHEN sex = '1' ...
  • SQL之CASE WHEN用法详解

    万次阅读 多人点赞 2018-08-30 14:43:02
    简单CASE WHEN函数: CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' END CASE SCORE WHEN 'C' THEN '中' ELSE '不及格' END 等同于,使用CASE WHEN条件表达式...
  • case函数详解

    千次阅读 2020-11-12 10:37:20
    case函数通常也被称为:流程控制函数 主要有两种形式 简单case函数 通常用于情况不多且可枚举出来的情况 通常形式如下: CASE <col_name> WHEN <value1> THEN <result1> WHEN <value2> ...
  • case语句中case的用法

    2018-10-14 01:38:41
    ``` case 5: switch(b) { case '+': printf("The score is 100.\n"); break; case '-': printf("The score is 85.\n"); break; case '0': printf("The score is 90.\n"); break; ...
  • Verilog中case语句综合出的电路

    千次阅读 2020-08-30 11:02:01
    本文对Verilog中不同情况下case语句综合出的电路进行了讨论。
  • MySQL case when 用法

    万次阅读 多人点赞 2018-03-19 15:09:13
    MySQL 的 case when 的语法有两种: CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END CASE WHEN [expr] THEN [result1]…ELSE [default] END 这两种语法有什么区别呢? CASE [col_...
  • Java 条件语句&switch case 语句

    千次阅读 2020-05-17 17:15:41
    } } } //结果:1 //2 //default 如果当前匹配成功的 case 语句块没有 break 语句,则从当前 case 开始,后续所有 case 的值都会输出,如果后续的 case 语句块有 break 语句则会跳出判断。 public class Test { ...
  • Verilog中的 full case 与 parallel case

    千次阅读 2020-09-25 22:08:13
    在使用Verilog时,case语句时非常常见的,case语句中有些非常有意思的东西,full case 与 parallel case,在这里我想写一下一些关于它们的相关知识。 一、full case 在使用case时,我们一般要求在没有罗列所有情况时...
  • case语句的用法

    千次阅读 2018-04-16 16:14:11
    CASE WHEN 及 SELECT CASE WHEN的用法 Case具有两种格式。简单Case函数和Case搜索函数。 简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN ...
  • Verilog语言中casecasex、casez的用法和区别

    万次阅读 多人点赞 2019-10-17 17:12:55
    Verilog语言中casecasex、casez的用法和区别 casez与casex语句是case语句的两种变体, 在写testbench时用到。 一、casecasex、casez的区别 下表给出casecasex、casez的真值表 二、case/casez/casex 在...
  • mybatis case 判断

    千次阅读 2020-05-19 17:10:13
    一般的项目sql中,对查询的结果,需要做转换的时候,一般都会在java中处理,不会直接在sql中处理,目的是脱离数据库,减少数据库的压力,从设计上也应该做这样的分离。...主要是sql 中case的使用,快速对结果集做转换
  • switch case用法详解

    万次阅读 多人点赞 2019-06-09 19:43:07
    switch case用法详解 switch 是“开关”的意思,它也是一种“选择”语句,但它的用法非常简单。switch 是多分支选择语句。说得通俗点,多分支就是多个 if。从功能上说,switch 语句和 if 语句完全可以相互取代。但...
  • java中的 switch-case 开关语句,大家应该都不陌生。 常见的是使用方式是这样的: switch (clock) { case 1: System.out.println(1); break; case 2: System...
  • Mybatis返回值替换case when then end

    千次阅读 2020-08-16 21:22:21
    一、case when then end selet id, CASE status WHEN '1' THEN '通过' WHEN '0' THEN '未通过' END status from demo 二、case when then else end selet id, CASE status WHEN 1 THEN 1 ELSE 0 .
  • 理解case class的用法

    千次阅读 2019-08-08 11:18:35
    case class PiecewiseInfo(separateValues: List[Double]=List(0.0), allowedValues: List[(Int, Int)]=List((-1,1)) ) 以此 case class 为例,探讨一些特性。 知识结构来自https:/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,322,111
精华内容 928,844
关键字:

case