使用数字条件查询字母数字字段

时间:2016-05-02 18:12:41

标签: sql

我正在尝试获得类ID大于300的所有类的结果。我尝试了多种方法但仍然无法弄清楚

select c_id
from class
where c_id > '300';

C_ID
---------------
Seminar
WRIT 101
IDIS 302
WRIT 300
ACCT 201
BULA 151
CMAT 201/303
ECON 200
INSS 209
INSS 225
MATH 111
OPRE 201
OPRE 202
INSS 300
MGMT 301
MGMT 315
OPRE 315
INSS 315
INSS 406
INSS 421
INSS 427
INSS 460
INSS 490

23 rows selected.

所需的结果将给出课程ID超过300或以上的课程总数(例如:INSS 300,INSS421,MGMT 315等应包含在计数中)

2 个答案:

答案 0 :(得分:0)

如果您正在使用t-SQL(例如,SQL Server),请尝试类似:

SELECT c_ID
FROM class
WHERE TRY_CAST(RIGHT(c_ID, 3) AS int) > 300

如果你真的只需要计数而不是列表,那么

SELECT COUNT(c_ID) AS ClassCount300Plus
FROM class
WHERE TRY_CAST(RIGHT(c_ID, 3) AS int) > 300

应该足够了。

编辑:如果“研讨会”之类的内容出现在您的c_ID列表中,您似乎会遇到转换错误。所以,您应该使用TRY_CAST而不是CONVERT。

另请注意,如果您有任何4位c_ID,则无法使用此功能。

答案 1 :(得分:0)

我必须对你需要处理什么做出一些假设" CMAT 201/303"。鉴于这是类列表的上下文,我假设这是两个单独的类。所以我想出的查询是相当长的,以便处理那一个案例。此外,由于您需要使用该类号进行过滤(即类> 300),因此需要使用数字,因此需要使用该斜杠完成某些。如果不应将其拆分为两个类,则原始帖子中需要更多详细信息。

为了使SUBSTRING和WHERE子句更容易阅读,我创建了CTE" pos"。这不是必要的,但我认为它更容易理解。

WITH pos AS (
    SELECT C_ID, CHARINDEX(' ', C_ID) AS spaceIndex, CHARINDEX('/', C_ID) AS slashIndex 
    FROM class
)
,SPLIT AS (
    --Get everything without a slash
    SELECT LEFT(C_ID, spaceIndex - 1) AS CLASS, SUBSTRING(C_ID, spaceIndex + 1, LEN(C_ID) - spaceIndex + 1) AS NUM
    FROM pos 
    WHERE spaceIndex > 0
    AND slashIndex = 0
    UNION 
    --Get the left side of the slash
    SELECT LEFT(C_ID, spaceIndex - 1) AS CLASS, SUBSTRING(C_ID, spaceIndex + 1, slashIndex - spaceIndex - 1) AS NUM
    FROM pos
    WHERE spaceIndex > 0
    AND slashIndex > 0
    UNION 
    --Get the right side of the slash
    SELECT LEFT(C_ID, spaceIndex - 1) AS CLASS, SUBSTRING(C_ID, slashIndex + 1, LEN(C_ID) - slashIndex) AS NUM
    FROM pos
    WHERE spaceIndex > 0
    AND slashIndex > 0
)
SELECT * 
FROM SPLIT
WHERE NUM > 300
ORDER BY 1
;