2012-04-10 22 views
2

我有一个非常简单的问题:是否可以根据满足哪个条件来检索行? 例如,我有一张人的桌子,我想检索名称以“I”开头,或以“ster”结尾或包含“lo”的所有人,根据这些人的条件。首先匹配第一个条件的行,然后匹配第二个条件的行,依此类推。 (不重复:如果行符合第一个条件,它不应再为第二个条件显示)根据符合哪种条件来排序?

编辑: 我用Visual C#工作,我管理与MS访问数据库。 (文件格式的.mdb,如果该事项)

谢谢=)

+0

不可能通过标准的sql。你可以通过编程来完成,但是如果你将结果集检索到Java,C#等等 – ControlAltDel 2012-04-10 17:53:22

+4

不,这在标准SQL中是完全可能的。这只是一点点参与取决于一些细节。 – RBarryYoung 2012-04-10 17:57:47

+0

真正的问题是,Access支持标准SQL的一个较小的子集,而不是比较大的DBMS(比如SQL Server,Oracle,DB2等),因此可能不支持所有不同的方法。 – RBarryYoung 2012-04-10 18:01:15

回答

3

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 
+0

+1 ...正确顺序为Access – 2012-04-10 18:36:16

+0

作品,谢谢:) – 2012-04-10 18:36:38

6

一般来说,你可以把一个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))); 
+0

我编辑了原文,让所有人都可以看到。 – 2012-04-10 17:57:41

+0

@Itamar Marom,请让我知道这是否有效,如果语法稍微偏离(不幸的是我现在无法检查),请在此处编辑最终的Access查询。 – 2012-04-10 18:23:50

+0

当我尝试运行时,它要求'sortCol'好像它是一个参数... – 2012-04-10 18:31:23

1

我给了这是一个用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标签,但如果它可以帮助任何人,我会离开它。

1

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?