2017-08-17 148 views
0

MSAccess 2007 SQL如何对SQL结果进行无序排序?

我正在为表列中的值编写用户搜索下拉菜单。

如果用户在字段中键入'xyz',我想查找搜索列开头的所有行,或者包含'xyz'。但我想要那些列以'xyz'开头的行首先排序,然后是那些列中包含'xyz'的行。我知道如何使用带有通配符的LIKE子句来查找所需的行,问题是如何获取以下顺序返回的结果集。

例如,如果我的搜索栏包含:

  • abcxyz
  • MNO
  • XYZABC
  • xyzmon
  • 2xyz
  • abcxyzruf
  • zxyz

我想查询返回这里列包含顺序 'XYZ' 的所有行:

  • XYZABC
  • xyzmon
  • 2xyz
  • abcxyz
  • abcxyzruf
  • zxyz

什么是最好的,最e仅在MSaccess 2007中使用SQL进行此操作的唯一方法是什么?

+0

排序的逻辑是什么? –

+0

大卫 - 那些以搜索字符串开始的字符串首先按照字母顺序排序的ASC,并且那些包含搜索字符串的字符串会在那些以字母开头的字符串之后出现,并且这些字符串也将按字母顺序排序。 – user2184214

回答

3

您可以使用instr()

order by instr(col, "xyz") 

注:这是假设所有字符串中都有"xyz"。如果不是,那么非匹配将(不直觉地)首先出现。但是,对于您的示例数据,所有值都有"xyz"

编辑:

为了您的修订版:

order by iif(col like "xyz*", 1, 2), col 
+0

Thx Gordon。是的,所有记录都会有'xyz'。然而,聪明的主意,但那些不以'xyz'开头的内容现在将根据'xyz'在里面找到,而不是按字母顺序排序。这意味着'zxyz'会出现在'aaaxyz'之前。我需要包含结果的字符串按照字母顺序排列,并以'xyz'开头。 – user2184214

0

戈登的回答让我在正确的轨道上。

Order By iif(instr(col, 'xyz')=1, instr(col, 'xyz'), col), col 

这样做!非常感谢戈登。 Order By的第二列强制开始 - 子组也按字母顺序排序。

相关问题