我有一个非常简单的问题:是否可以根据满足哪个条件来检索行? 例如,我有一张人的桌子,我想检索名称以“I”开头,或以“ster”结尾或包含“lo”的所有人,根据这些人的条件。首先匹配第一个条件的行,然后匹配第二个条件的行,依此类推。 (不重复:如果行符合第一个条件,它不应再为第二个条件显示)根据符合哪种条件来排序?
编辑: 我用Visual C#工作,我管理与MS访问数据库。 (文件格式的.mdb,如果该事项)
谢谢=)
我有一个非常简单的问题:是否可以根据满足哪个条件来检索行? 例如,我有一张人的桌子,我想检索名称以“I”开头,或以“ster”结尾或包含“lo”的所有人,根据这些人的条件。首先匹配第一个条件的行,然后匹配第二个条件的行,依此类推。 (不重复:如果行符合第一个条件,它不应再为第二个条件显示)根据符合哪种条件来排序?
编辑: 我用Visual C#工作,我管理与MS访问数据库。 (文件格式的.mdb,如果该事项)
谢谢=)
Somet兴这样应该工作:
SELECT * FROM people
ORDER BY
CASE WHEN name LIKE "I%" THEN 0
WHEN name LIKE "%ster" THEN 1
WHEN name LIKE "%lo%" THEN 2
ELSE 3
END ASC;
在访问你可能不得不求助于嵌套IIF()
小号虽然:
ORDER BY
IIF(name LIKE "I%", 0,
IIF(name LIKE "%ster%", 1,
IIF(name LIKE "%lo%", 2,
3
))) ASC
+1 ...正确顺序为Access – 2012-04-10 18:36:16
作品,谢谢:) – 2012-04-10 18:36:38
一般来说,你可以把一个case语句在order by
。
这将在SQL Server中工作,例如:
order by (case when myCol like 'I%' then 1 when myCol like '%ster' then 2 when myCol like '%lo%' then 3 end)
是否使用的是DBMS?
UPDATE
对于MS-Access,您可以使用IIF
语句如图这样的回答:
ms-access-complicated-order-by
基于这一点,你可能想沿着东西线:
SELECT *
FROM people
WHERE [name] Like "I*" Or [name] Like "*ster" Or [name] Like "*lo*"
ORDER BY IIf([name] Like "I*", 1, IIf([name] Like "*ster", 2, IIf([name] Like "*lo*", 3, 4)));
我编辑了原文,让所有人都可以看到。 – 2012-04-10 17:57:41
@Itamar Marom,请让我知道这是否有效,如果语法稍微偏离(不幸的是我现在无法检查),请在此处编辑最终的Access查询。 – 2012-04-10 18:23:50
当我尝试运行时,它要求'sortCol'好像它是一个参数... – 2012-04-10 18:31:23
我给了这是一个用Postgres的射门,但我会假设你可以使用与其他数据库类似的技术。我会为每个条件创建一个列,以返回条件是否满足的布尔表达式。然后,命令由该列:
select
substr(Name, 1, 1) = 'I' as StartsWithI,
Name like '%ster' as EndsWithSter
from MyTable
order by StartsWithI desc, EndsWithSter desc
UPDATE:
我张贴了这个答案后添加ms-access
标签,但如果它可以帮助任何人,我会离开它。
Switch
的函数比一堆嵌套IIf
语句更可读:
SELECT * FROM [People]
WHERE [Name] Like "I*"
OR [Name] Like "*ster"
OR [Name] Like "*lo*"
ORDER BY Switch([Name] Like "I*", 1,
[Name] Like "*ster", 2,
True, 3)
Switch
用于通过传递条件参数对:结果。对参数1进行评估,如果为true,则函数返回参数2.如果参数1为假,则对参数3进行评估等。
请注意使用True
作为倒数第二个参数,它的作用类似于CASE ELSE
。
请注意,根据具体情况,您可能需要将*
转换为%
。有关更多信息,请参见Why does LIKE behave differently when being called from VB6 app?。
不可能通过标准的sql。你可以通过编程来完成,但是如果你将结果集检索到Java,C#等等 – ControlAltDel 2012-04-10 17:53:22
不,这在标准SQL中是完全可能的。这只是一点点参与取决于一些细节。 – RBarryYoung 2012-04-10 17:57:47
真正的问题是,Access支持标准SQL的一个较小的子集,而不是比较大的DBMS(比如SQL Server,Oracle,DB2等),因此可能不支持所有不同的方法。 – RBarryYoung 2012-04-10 18:01:15