sql - 使用 SQL 按案例排序

标签 sql ms-access

我有下表:

+----+----------+-----+-----------+----------+
| 1 | Ramesh   | 32 | Ahmedabad | 2000.00 |
| 7 | Muffy    | 24 | Indore    | 10000.00 |
| 6 | Komal    | 22 | MP       | 4500.00 |
| 2 | Khilan   | 25 | Delhi     | 1500.00 |
| 3 | kaushik  | 23 | Kota      | 2000.00 |
| 5 | Hardik   | 27 | Bhopal    | 8500.00 |
| 4 | Chaitali | 25 | Mumbai    | 6500.00 |
+----+----------+-----+-----------+----------+

并且,我正在使用以下查询按照我的首选顺序对表进行排序,但我收到以下 SQL 错误:

CURSOR OPERATION CONFLICT

我的查询:

SELECT * FROM CUSTOMERS ORDER BY (CASE ADDRESS WHEN 'DELHI'   THEN 1
WHEN 'BHOPAL'   THEN 2
WHEN 'KOTA'   THEN 3
WHEN 'AHMADABAD' THEN 4
WHEN 'MP'  THEN 5
ELSE 100 END) ASC, ADDRESS DESC

最佳答案

由于 Access 不支持 CASE...WHEN,您有两种选择来获取自定义排序顺序。

1) 如果您可以编辑数据库结构,请将“SortOrder”列添加到表中。

假设“Address”字段在“CUSTOMERS”表中具有唯一值,在“CUSTOMERS”表中创建一个名为“SortOrder”的字段,指定“1”代表“Delhi”,“2”代表“Bhopal”,等等:

SELECT *
FROM CUSTOMERS
ORDER BY CUSTOMERS.SortOrder DESC;

但是,如果同一个“Address”值可能在“CUSTOMERS”表中出现多次,您应该创建一个新表,如“ADDRESSES”,其中包含 Address 和 SortOrder 值。SQL 最终会看起来像这样:

SELECT CUSTOMERS.* 
FROM CUSTOMERS INNER JOIN ADDRESSES ON CUSTOMERS.Address = ADDRESSES.Address 
ORDER BY ADDRESSES.SortOrder DESC;

2) 或者,如果您不能编辑数据库结构,请在 ORDER BY 子句中使用 IIf() 函数:

SELECT *
FROM CUSTOMERS
ORDER BY IIf([ADDRESS] = 'DELHI',1,IIf([ADDRESS] = 'BHOPAL',2,
IIf([ADDRESS] = 'KOTA',3,IIf([ADDRESS] = 'AHMADABAD',4,
IIf([ADDRESS] = 'MP',5,6))))) DESC;

你应该避免这样做,除非你不能编辑数据库结构,因为函数调用很慢,尤其是当像本例那样评估多个条件时。如果您需要为“ADDRESS”字段指定任何额外的排序,您将需要添加额外的 IIf() 函数,这将进一步减慢速度。

如果您能够为“ADDRESS”的每个值指定排序顺序,您应该使用单个 Switch() 函数而不是嵌套的 IIf() 函数。

关于sql - 使用 SQL 按案例排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23778763/

相关文章:

ms-access - MS Access 崩溃,现在所有表单对象和代码模块都丢失了

excel - VBA中的ADODB记录集说excel字段不是空的

java - 使用 JDBC java 更改 MDB 文件中的列名

SQL 从零到一,或 bool 值

Mysql统计外键的不同id

mysql - 将 MySQL 代码转换为 Access : GROUP_CONCAT and a triple JOIN

ms-access - 循环遍历名称类似于示例的查询

sql - 通过旋转将 Presto 列转换为行

mysql - 从多个表中删除多行

MySQL 左外连接验证?