深入理解PROCSQL逻辑编码
立即解锁
发布时间: 2025-08-21 02:10:33 阅读量: 1 订阅数: 4 


深入掌握PROC SQL与SAS数据处理技巧
### 深入理解 PROC SQL 逻辑编码
#### 1. 引言
在 SQL 过程中,表达式可以简单也可以复杂,它由列、符号、运算符、函数、常量和文字值组合而成。这些表达式通常在 SQL 语句和子句中使用,尤其在条件逻辑结构里,用于测试或比较一个值与另一个值。在 CASE 表达式中应用这些表达式,能让我们对数据的每一行进行处理和分组,还能对数据进行重新编码和重塑,从而拓宽数据分析和处理的视角。
#### 2. 条件逻辑
有经验的 PROC SQL 程序员都知道,常常需要测试和评估条件的真假。从编程角度看,条件的评估结果决定了程序将遵循的路径。SQL 过程中的条件逻辑经常在 WHERE 子句中实现,用于引用常量以及列和值之间的关系。同时,SQL 过程也允许在 SELECT 语句中使用 case 表达式来识别和分配数据值。
以下是几个简单示例,展示了 WHERE 子句如何引用常量和关系:
- **筛选价格低于 400 美元的产品**
```sql
PROC SQL;
SELECT *
FROM PRODUCTS
WHERE PRODCOST < 400.00;
QUIT;
```
在执行时,当 PRODCOST 的值小于 400.00 时,表达式为真,相应的数据行被选中;否则,表达式为假,数据行不被选中。
- **筛选价格高于 400 美元的产品**
```sql
PROC SQL;
SELECT *
FROM PRODUCTS
WHERE PRODCOST > 400.00;
QUIT;
```
当 PRODCOST 的值大于 400.00 时,表达式为真,数据行被选中;反之则不被选中。
- **筛选产品类型为“Software”的产品**
```sql
PROC SQL;
SELECT *
FROM PRODUCTS
WHERE PRODTYPE = “Software”;
QUIT;
```
该表达式区分大小写,只有当 PRODTYPE 的当前值逐字符与 “Software” 相同时,条件为真,满足条件的数据行被选中。
为确保字符值的逐字符匹配,可以使用 UPCASE 函数:
```sql
PROC SQL;
SELECT *
FROM PRODUCTS
WHERE UPCASE(PRODTYPE) = “SOFTWARE”;
QUIT;
```
对于非数值值使用 < 和 > 关系时,会涉及到字符的排序序列问题,不同操作系统的排序序列可能不同,具体可参考相应操作系统的文档。
#### 3. CASE 表达式
在 SQL 过程中,CASE 表达式提供了一种确定表(或视图)中所有行结果值的方法。它类似于 DATA 步的 SELECT 语句(或 IF - THEN/ELSE 语句),基于某个条件,使用 WHEN - THEN 子句来确定结果值。还可以指定一个可选的 ELSE 表达式,用于处理当 WHEN 条件都不满足时的情况。
SQL 过程支持两种形式的 CASE 表达式:简单 CASE 表达式和搜索式 CASE 表达式。CASE 表达式可以在 SELECT 子句、WHERE 子句、ORDER BY 子句、HAVING 子句、连接结构以及任何可以使用表达式的地方使用。其基本语法如下:
```sql
CASE <column-name>
WHEN when-condition THEN result-expression
<WHEN when-condition THEN result-expression> …
<ELSE result-expression>
END
```
CASE 语法从 CASE 到 END 包含了所有内容。列名可以作为 CASE 表达式的一部分可选指定。如果指定了列名,它会自动在每个 WHEN 条件中可用;如果未指定,则必须在每个 WHEN 条件中编码列名。
CASE 表达式的工作原理如下:
1. 一个或多个 WHEN 条件按列出的顺序进行评估。
2. 如果表(或视图)中的某一行满足某个 WHEN 条件,则该条件为真,执行 THEN 关键字后面的结果表达式,其余 WHEN 条件将被跳过。
3. 如果一个 WHEN 条件为假,则评估下一个 WHEN 条件。
4. SQL 会一直评估每个 WHEN 条件,直到找到一个为真的条件。如果所有 WHEN 条件都为假,则执行 ELSE 表达式,并将其值赋给 CASE 表达式的结果。
5. 如果未指定 ELSE 表达式,且每个 WHEN 条件都为假,则将缺失值赋给 CASE 表达式。
#### 4. 简单 CASE 表达式
简单 CASE 表达式正如其名,提供了一种执行最简单类型比较的有用方法。其语法要求在 CASE 表达式中指定底层表的列名,这样不仅避免了在每个 WHEN 条件中重复列名,还减少了输入量,使代码更易读和维护。简单 CASE 表达式具有以下特点:
- 只允许进行相等性检查。
- 按指定顺序评估 WHEN 条件。
- 评估每个 WHEN 条件的输入表达式。
- 返回第一个评估为真的输入表达式的结果表达式。
- 如果没有输入表达式评估为真,则处理 ELSE 条件。
- 如果未指定 ELSE 条件,则分配 NULL 值。
##### 4.1 简单 CASE 表达式在 SELECT 子句中的应用
以下是几个简单 CASE 表达式在 SELECT 子句中的示例:
- **根据制造商所在州分配区域标签**
```sql
PROC SQL;
SELECT MANUNAME,
MANUSTAT,
CASE MANUSTAT
WHEN 'CA' THEN 'West'
WHEN 'FL' THEN 'East'
WHEN 'TX' THEN 'Central'
ELSE 'Unknown'
END AS Region
FROM MANUFACTURERS;
QUIT;
```
该示例根据制造商所在的州(MANUSTAT),将其分配到不同的区域(East、Central、West 或 Unknown),并将结果存储在名为 Region 的列中。
- **根据产品类型对产品进行分类**
```sql
PROC SQL;
SELECT PRODNAME,
CASE PRODTYPE
WHEN ‘Laptop’ THEN ‘Hardware’
WHEN ‘Phone’ THEN ‘Hardware’
WHEN ‘Software’ THEN ‘Software’
WHEN ‘Workstation’ THEN ‘Hardware’
ELSE ‘Unknown’
END AS Product_Classification
FROM PRODUCTS;
QUIT;
```
此示例根据产品类型(PRODTYPE),将产品分类为硬件、软件或未知类型,并将结果存储在名为 Product_Classification 的列中。
- **根据产品编号的第一位对产品进行分类**
```sql
PROC SQL;
SELECT PRODNAME,
PRODNUM,
CASE SUBSTR(PUT(PRODNUM,4.),1,1)
WHEN ‘1’ THEN ‘Laptop/Workstation’
WHEN ‘2’ THEN ‘Phone’
WHEN ‘5’ THEN ‘Software’
ELSE ‘Unknown’
END AS Product_Classification
FROM PRODUCTS
ORDER BY PRODNUM;
QUIT;
```
该示例先将产品编号(PRODNUM)转换为字符值,然后提取其第一位,根据该值对产品进行分类,并将结果存储在名为 Product_Classification 的列中,最后按产品编号排序。
- **使用子查询筛选软件产品**
```sql
PROC SQL;
SELECT *
FROM
(SELECT PRODNAME,
PRODNUM,
CASE SUBSTR(PUT(PRODNUM,4.),1,1)
WHEN ‘1’ THEN ‘Laptop/Workstation’
WHEN ‘2’ THEN ‘Phone’
WHEN ‘5’ THEN ‘Software’
ELSE ‘Unknown’
END AS Product_Classification
FROM PRODUCTS
)
WHERE Product_Classification = ‘Software’;
QUIT;
```
此示例使用子查询,先对产品进行分类,然后筛选出分类为软件的产品。
##### 4.2 简单 CASE 表达式在 WHERE 子句中的应用
由于 SQL 过程支持在任何可以使用表达式的地方使用 CASE 表达式,因此可以将 CASE 表达式的结果值直接传递给 WHERE 子句,而不是使用硬编码的值。
```sql
PROC SQL;
SELECT MANUNAME,
MANUSTAT
FROM MANUFACTURERS
WHERE CASE MANUSTAT
WHEN 'CA' THEN 1
ELSE 0
END;
QUIT;
```
该示例筛选出位于加利福尼亚州(CA)的制造商。
##### 4.3 使用简单 CASE 表达式创建自定义列表
可以在 SELECT 和 ORDER BY 子句中使用简单 CASE 表达式来编码自定义的显示和顺序。
```sql
OPTIONS LS=120;
PROC SQL;
SELECT PRODNAME,
```
0
0
复制全文
相关推荐










