【问题标题】:order by case using SQL使用 SQL 按大小写排序
【发布时间】:2014-05-21 09:09:31
【问题描述】:

我有下表:

+----+----------+-----+-----------+----------+
| 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 错误:

光标操作冲突

我的查询:

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

【问题讨论】:

  • 欢迎来到 SO,我已经为您格式化了您的代码,但请编辑您的问题并删除所有大写字母。
  • 并将您的回复标记为已回答!你问了 5 个问题,没有一个是正确关闭的!

标签: sql ms-access


【解决方案1】:

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

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

假设“地址”字段在“客户”表中具有唯一值,在“客户”表中创建一个名为“SortOrder”的字段,指定“1”代表“德里”,“2”代表“博帕尔”,等等:

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;

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

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

【讨论】:

  • 试过上面的查询得到错误'insufficient memory'
  • 也试过开关命令ORDER BY switch (cable_type = 'image 1000', 1, cable_type = 'cat 6a' , 2) 和上面一样的错误'insufficient memory'
  • 您的数据与您在问题顶部显示的完全一样吗?我在测试数据库中使用该数据创建了一个表,并且能够使用我提供的 SQL 对其进行正确排序。还有,这些 cable type/cable_type 字段是从哪里来的?
  • 数据是同类型的,只是address列被cable_type列替换,但主要目的是对数据进行排序
  • SELECT * FROM MASTER_SCHEDULE_PEO WHERE RACK_A 不为空且 RACK_B 不为空且 EQIUPMENT_KRONE_IDA 类似于 '%%WB 8%%' 或 RACK_A 不为空且 RACK_B 不为空且 EQIUPMENT_KRONE_IDB 类似于 '%%WB 8%%' IIF 订购([CABLE_TYPE] = 'IMAGE 1000',1,IIF([CABLE_TYPE] = 'CAT 6A',2,IIF([CABLE_TYPE] = 'IMAGE 360',3,4)))
【解决方案2】:

CASE 在 Access 中不存在。你可以改用Switch()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多