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

  • 本文关键字:数字 字段 条件 查询 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等应包含在计数中)

如果您碰巧在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,这将不适用于任何4位c_ID。

我不得不对处理"CMAT 201/303"需要做一些假设。考虑到这是类列表的上下文,我假设这是两个独立的类。因此,为了处理这一案例,我提出的查询相当长。此外,由于您需要使用该类名进行筛选(即classes>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
;

最新更新