如何按字母和数字排序?

5

如何在 SQL-Server 中按字母顺序排序查询结果,然后再按数字值排序?

我有一个名为 aColumn 的 myTable 表需要进行查询。

我找到了这篇文章,其中提到尝试以下语句:

SELECT * FROM dbo.myTable
WHERE aColumn LIKE '%val'
ORDER BY IF(aColumn RLIKE '^[a-z]', 1, 2), aColumn

然而这只适用于MySQL,这可能是为什么在SQL-Server中无法使用的原因。是否有类似于正则表达式过滤器的东西可以用于SQL-Server?我得到的错误消息是:

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'IF'
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'RLIKE'

我希望看到的是类似于以下内容:

我想看到的是这样的东西:

Aval
Bval
Cval
1val
2val

更适合,而非
1val
2val
Aval
Bval
Cval
2个回答

8
您可以使用LIKE谓词:
SELECT m.* 
FROM dbo.myTable m
WHERE aColumn LIKE '%val'
ORDER BY (CASE WHEN aColumn like '[a-z]%' THEN 0 ELSE 1 END), aColumn;

非常好的答案,但是如果我在*之前的第一行和dbo.myTable之后的第二行删除了m,它也可以工作,这些m是怎么回事? - G. LC
1
@G.LC. . . 这个查询没有问题。但是,创建表的别名以了解它来自哪里是一个好习惯。 - Yogesh Sharma

2

我猜想在一些情况下可能会出现数字或其他需要排序的方式。这里提供了一个灵活的解决方案:

DECLARE @TOTALS TABLE
(
  ID INT IDENTITY,
  THEDATA VARCHAR(255)
)

INSERT INTO @TOTALS (THEDATA)
SELECT THEDATA FROM atest 
WHERE THEDATA NOT LIKE '%[0-9]%'
ORDER BY THEDATA ASC

INSERT INTO @TOTALS (THEDATA)
SELECT THEDATA FROM atest 
WHERE THEDATA LIKE '%[0-9]%'
ORDER BY THEDATA ASC

SELECT * FROM @TOTALS
ORDER BY ID ASC

您可以创建一个“表变量”并使用各种“SELECT”语句来填充该表。由于它具有一个“IDENTITY”列,因此它可以跟踪插入项目的顺序。然后只需按该顺序进行“SELECT”即可!在这种情况下,我只是将所有没有数字的值(已排序)放在一起,然后将所有具有数字的值(已排序)放在一起。希望这能帮到您 :)

1
谢谢,直到现在我才看到这个。 - G. LC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接