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]
我想订购一个包含整数和字符串的 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]