强大的sql :switch case

本文介绍了SQL语言中CASE语句的使用方法及其多种应用场景,包括如何在SELECT、GROUP BY及ORDER BY子句中使用CASE语句实现灵活的数据处理。

sql语言中有没有类似C语言中的switch case的语句??

  没有,用case   when   来代替就行了.   
       
  例如,下面的语句显示中文年月  
   
  select   getdate()   as   日期,case   month(getdate())  
  when   11   then   '十一'  
  when   12   then   '十二'  
  else   substring('一二三四五六七八九十',   month(getdate()),1)  
  end+'月'   as   月份

=================================================

CASE 可能是 SQL 中被误用最多的关键字之一。虽然你可能以前用过这个关键字来创建字段,但是它还具有更多用法。例如,你可以在 WHERE 子句中使用 CASE
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁首先让我们看一下
CASE 的语法。在一般的 SELECT 中,其语法如下:
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT <myColumnSpec> =
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
CASE
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
WHEN <A> THEN <somethingA>
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
WHEN <B> THEN <somethingB>
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
ELSE <somethingE>
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
END
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁在上面的代码中需要用具体的参数代替尖括号中的内容。下面是一个简单的例子:
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
USE pubs
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title,
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
'Price Range' =
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
FROM titles
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
ORDER BY price
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁这是
CASE 的典型用法,但是使用 CASE 其实可以做更多的事情。比方说下面的 GROUP BY 子句中的 CASE
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT 'Number of Titles', Count(*)
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
FROM titles
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GROUP BY
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁你甚至还可以组合这些选项,添加一个
ORDER BY 子句,如下所示:
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
USE pubs
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
SELECT
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END AS Range,
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
FROM titles
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GROUP BY
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END,
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
ORDER BY
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
CASE
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price IS NULL THEN 'Unpriced'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price < 10 THEN 'Bargain'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
WHEN price BETWEEN 10 and 20 THEN 'Average'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁        
ELSE 'Gift to impress relatives'
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁    
END,
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁     Title
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
GO
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁注意,为了在
GROUP BY 块中使用 CASE,查询语句需要在 GROUP BY 块中重复 SELECT 块中的 CASE 块。
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁
sql 中 case when 语法在这里添加日志标题 - 钱途无梁 - Notebook of 钱途无梁除了选择自定义字段之外,在很多情况下
CASE 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。

 
=================================================
package com.alibaba.yunbi.v2.datacube.util; import com.alibaba.nox.common.util.SqlPure; import com.alibaba.yunbi.v2.common.dal.enums.DataSourceTypeEnum; import java.util.UUID; /** * SQLTEST工具类 * @author: jingyao.wjy * @date: 2018-12-02 09:14. */ public class SqlTextUtils { public static String getSqlLimitByDsType(String sqlText,DataSourceTypeEnum dsType, int limit){ sqlText = SqlPure.pure(sqlText); String limitSqlText; switch (dsType){ case MYSQL: case DLA: case DRDS: case GARUDA: case HANA: case PRESTO: case POLARDB: case HBASE: case TSDB: case LINDORM_TSDB: case LINDORM_WIDE_TABLE_ENGINE: case LINDORM_MULTI_MODE: case ADB: case MYSQL_HYBRID: case DATAPHIN_ODPS: case DATAPHIN_V2_ODPS: case IMPALA: case IMPALA_V3: case SNOWFLAKE: case KYLIN: case SPARK_SQL: case ADB_SPARK: case OCEANBASE_MYSQL: case HIVE: case STARROCKS: case ODPS: case UNICORN: case SLS: case ELASTICSEARCH: case TIDB: case MARIADB: case OSCAR: case AURORA_MYSQL: limitSqlText = "select * from (" + sqlText + " ) " + SQLMetaUtils.genLogicTableName(UUID.randomUUID().toString()) + " limit " + limit; break; case GREENPLUM: case GREENPLUM_V6: case POSTGRESQL: case PPAS: case VERTICA: case GAUSSDB_DWS: case GAUSSDB: case RELYT: case AURORA_POSTGRESQL: limitSqlText = "select * from (" + sqlText + " ) " + SQLMetaUtils.genLogicTableName(UUID.randomUUID().toString()) + " LIMIT " + limit + " OFFSET 0"; break; case DATAPHIN_HIVE: case DATAPHIN_V2_HIVE: limitSqlText = "select * from (" + sqlText + " ) " + SQLMetaUtils.genLogicTableName(UUID.randomUUID().toString()) + " LIMIT 0," + limit; break; case ORACLE: case OCEANBASE_ORACLE: limitSqlText = "select * from (" + sqlText + " ) " + SQLMetaUtils.genLogicTableName(UUID.randomUUID().toString()) + " WHERE ROWNUM <= " + limit; break; case SQLSERVER: case SYBASE: limitSqlText = "select top " + limit + " * from (" + sqlText + " ) " + SQLMetaUtils.genLogicTableName(UUID.randomUUID().toString()); break; case DB2: case DB2_V10: limitSqlText = "select * from (" + sqlText + " ) " + SQLMetaUtils.genLogicTableName(UUID.randomUUID().toString()) + " OFFSET 0 ROWS FETCH FIRST " + limit + " ROWS ONLY"; break; default: // 兜底 limitSqlText = "select * from (" + sqlText + " ) " + SQLMetaUtils.genLogicTableName(UUID.randomUUID().toString()) + " limit " + limit; break; } return limitSqlText; } }
最新发布
09-25
### 问题分析 DB2 SQL 执行报错 SQLCODE=-104,SQLSTATE=42601 通常表示 SQL 语句存在语法错误。对于 `SqlTextUtils` 类中针对 DB2 和 DB2_V10 生成的 SQL 语句 `select * from (sqlText ) genLogicTableName OFFSET 0 ROWS FETCH FIRST limit ROWS ONLY`,可能存在以下问题: #### 1. `sqlText` 未正确替换 如果 `sqlText` 没有被实际的 SQL 子查询语句替换,那么该语句会存在语法错误。例如: ```sql -- 错误示例,sqlText 未替换 select * from (sqlText ) genLogicTableName OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY -- 正确示例,sqlText 被替换 select * from (SELECT SYSTEM_ID ,SYSTEM_NAME FROM YY_SYSTEM ORDER BY SYSTEM_ID ) genLogicTableName OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY ``` #### 2. `limit` 未正确替换 如果 `limit` 没有被实际的数值替换,同样会导致语法错误。例如: ```sql -- 错误示例,limit 未替换 select * from (SELECT SYSTEM_ID ,SYSTEM_NAME FROM YY_SYSTEM ORDER BY SYSTEM_ID ) genLogicTableName OFFSET 0 ROWS FETCH FIRST limit ROWS ONLY -- 正确示例,limit 被替换 select * from (SELECT SYSTEM_ID ,SYSTEM_NAME FROM YY_SYSTEM ORDER BY SYSTEM_ID ) genLogicTableName OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY ``` #### 3. 子查询语法问题 如果 `sqlText` 本身的 SQL 子查询存在语法错误,也会导致整个 SQL 语句执行失败。例如,子查询中遗漏逗号、括号不匹配等。 #### 4. 数据库版本兼容性问题 虽然 `DB2_V10` 通常支持 `OFFSET` 和 `FETCH` 语法,但某些特殊配置或旧版本可能存在兼容性问题。 ### 解决办法 #### 1. 确保参数正确替换 在代码中,要保证 `sqlText` 和 `limit` 被正确替换为实际的 SQL 子查询语句和数值。示例代码如下(假设使用 Java): ```java public class SqlTextUtils { public static String generateSql(String sqlText, int limit, String genLogicTableName) { return String.format("select * from (%s) %s OFFSET 0 ROWS FETCH FIRST %d ROWS ONLY", sqlText, genLogicTableName, limit); } } // 使用示例 String sqlText = "SELECT SYSTEM_ID ,SYSTEM_NAME FROM YY_SYSTEM ORDER BY SYSTEM_ID"; int limit = 10; String genLogicTableName = "genLogicTableName"; String sql = SqlTextUtils.generateSql(sqlText, limit, genLogicTableName); System.out.println(sql); ``` #### 2. 验证子查询语法 在生成最终 SQL 语句之前,先验证 `sqlText` 子查询的语法是否正确。可以在数据库客户端(如 DB2 命令行工具)中单独执行子查询,确保其能够正常运行。 #### 3. 检查数据库版本兼容性 如果问题仍然存在,检查数据库版本是否支持 `OFFSET` 和 `FETCH` 语法。对于不支持的版本,可以考虑使用其他分页方法,如 `ROW_NUMBER()` 函数。示例代码如下: ```sql SELECT * FROM ( SELECT SYSTEM_ID, SYSTEM_NAME, ROW_NUMBER() OVER (ORDER BY SYSTEM_ID) as rn FROM YY_SYSTEM ) subquery WHERE rn BETWEEN 1 AND 10; ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值