SQL Order By in 和 varchar

SQL Order By in and varchar

我想订购一个包含整数和字符串的 nvarchar 类型的列。我想先订购整数 ASC,然后订购字符串。 这是我的 SQL 声明:

SELECT DISTINCT [Password] 
FROM OCPR 
WHERE [Password] IS NOT NULL
ORDER BY Password

结果是1, 10, 11, 12, 2, 3, K1, K2, N

我要1, 2, 3, 10, 11, 12, K1, K2, N.

SELECT DISTINCT [Password] 
FROM OCPR 
WHERE [Password] IS NOT NULL
ORDER BY
    CASE WHEN ISNUMERIC(Password) = 1 THEN 0 ELSE 1 END,
    CASE WHEN ISNUMERIC(Password) = 1 THEN CAST(Password AS INT) ELSE 0 END,
    Password

请试试这个。

你可以用 Patindex 来做这个

Declare @Tasks table(id [nvarchar](max) NOT NULL)

insert into @tasks values ('1'),('7'),('2'), ('12'),('23'),('10'),('K1'), ('K2'), ('P'), ('N')

SELECT * FROM @tasks
ORDER BY 
CASE 
  WHEN ISNUMERIC(id)=1 
  THEN CAST(id as int)

  WHEN PATINDEX('%[^0-9]%',id) > 1 
  THEN CAST(
    LEFT(
      id,
      PATINDEX('%[^0-9]%',id) - 1
    ) as int)

  ELSE 2147483648
END, 


CASE 
  WHEN ISNUMERIC(id)=1 
  THEN NULL

  WHEN PATINDEX('%[^0-9]%',id) > 1 
  THEN SUBSTRING(
      id,
      PATINDEX('%[^0-9]%',id) ,
      50
    ) 

  ELSE id
END
SELECT DISTINCT [Password] 
FROM OCPR 
WHERE [Password] IS NOT NULL
ORDER BY Password ASC

////////////////////////////////////////// ////////////

SELECT column_name, column_name
FROM table_name
ORDER BY column_name ASC|DESC, column_name ASC|DESC;

$query_test = "SELECT DISTINCT OCPR.密码 来自 OCPR WHERE OCPR.password 不为空 按 OCPR.password";

排序

您可以使用 ISNUMERIC 函数来完成。 您的查询将如下所示:

SELECT DISTINCT [Password] 
FROM OCPR 
WHERE [Password] IS NOT NULL
ORDER BY 
CASE WHEN ISNUMERIC([Password])=1 THEN CONVERT(int,[Password]) ELSE 99999999 END,
[Password]

希望这对您有所帮助 ;)

ISNUMERIC 没有回答您认为可以回答的问题。例如,ISNUMERIC('£') will return 1,但在尝试将其转换为 int 时会出错。 – Damien_The_Unbeliever

在您的数据库中创建此函数,它比内置的 ISNUMERIC()更好,并且总是准确!

CREATE FUNCTION dbo.IsAllDigits (@MyString VARCHAR(8000))
RETURNS TABLE AS
RETURN (
         SELECT CASE 
                WHEN @MyString NOT LIKE '%[^0-9]%'
                THEN 1
                ELSE 0
                END AS IsAllDigits
        )

然后使用此代码为例:

SELECT DISTINCT [Password] 
FROM OCPR 
WHERE [Password] IS NOT NULL
ORDER BY
    CASE WHEN IsAllDigits([Password]) = 1 THEN 0 ELSE 1 END,
    CASE WHEN IsAllDigits([Password]) = 1 THEN CAST([Password] AS INT) ELSE 0 END,
    [Password]