Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询带有数字条件的字母数字字段_Sql - Fatal编程技术网

Sql 查询带有数字条件的字母数字字段

Sql 查询带有数字条件的字母数字字段,sql,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

我正在尝试获取所有类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,这将不起作用。

我不得不对处理“CMAT 201/303”需要做一些假设。考虑到这是类列表的上下文,我假设这是两个独立的类。因此,我提出的问题相当长,以便处理这一案件。此外,由于您需要使用该类编号进行筛选(即类>300),因此需要使用数字,因此需要使用该斜杠进行某些操作。如果不将其分为两类,则需要在原始帖子中提供更多详细信息

为了使子字符串和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
;

您使用的是哪种DBMS?您需要删除前5个字符,以便与课程编号进行比较(假设课程类别代码始终为5位数字),并决定如何处理201/303。查看数据库的文档,了解如何修剪/排除WHERE子句中的字符。