Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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
介于x和x之间的SQL筛选器编号并忽略字符串_Sql_Sql Server_Where - Fatal编程技术网

介于x和x之间的SQL筛选器编号并忽略字符串

介于x和x之间的SQL筛选器编号并忽略字符串,sql,sql-server,where,Sql,Sql Server,Where,我在SQL Server中有一个表,需要按名称和类型筛选房间。问题是,名称存储为varchar,并且还有一些房间带有字母。我需要先过滤掉带有字母的房间,然后才能将它们作为int进行比较,否则我会得到一个错误 以下是Room中的一个示例。名称: 030 210a 210b Lan-Room-A 240 我可以使用a或b使用LEFT(Rooms.Name,3)处理房间名称,但如果我想添加(LEFT(Rooms.Name,3)在0和350之间到达Lan-Room-A它显然无法将字符串转换为int。我

我在SQL Server中有一个表,需要按名称和类型筛选房间。问题是,名称存储为
varchar
,并且还有一些房间带有字母。我需要先过滤掉带有字母的房间,然后才能将它们作为
int
进行比较,否则我会得到一个错误

以下是Room中的一个示例。名称:

030
210a
210b
Lan-Room-A
240
我可以使用
a
b
使用
LEFT(Rooms.Name,3)
处理房间名称,但如果我想添加
(LEFT(Rooms.Name,3)在0和350之间
到达
Lan-Room-A
它显然无法将字符串转换为int。我还需要进行额外的过滤,例如
Room.Type=6

SELECT
    Room.Name,
    Room.Descr,
    Room.MainUser
WHERE
    LEFT(Room.Name, 1) NOT LIKE '%[0-9]%' 
    AND LEFT(Room.Name, 3) BETWEEN 0 AND 350  
    AND Room.Type = 6
(为了简单起见,删除了一些连接)

我只需要过滤掉when子句之前包含字符串的行,但我不知道如何过滤

你们知道吗

请注意,我无法编辑数据库


提前感谢。

您可以使用
试播

SELECT *
FROM Rooms
WHERE TRY_CAST(LEFT(Rooms.Name, 3) AS INT) BETWEEN 0 and 350;


即使检查正确,也不能保证第二种方法有效:

WHERE LEFT(Room.Name, 1) NOT LIKE '%[0-9]%' 
  AND LEFT(Room.Name, 3) BETWEEN 0 AND 350  
  and Room.Type = 6

查询优化器可以按任何顺序检查条件,因此0到350之间的
LEFT(Room.Name,3)可能会产生转换错误。

对于2008年。请使用此选项

解决方案-

;WITH CTE AS
(
    SELECT '030' a UNION ALL
    SELECT '210a' UNION ALL
    SELECT '210b' UNION ALL
    SELECT 'Lan-Room-A' UNION ALL
    SELECT '240'
)
SELECT * FROM CTE
WHERE 
PATINDEX('%[0-9]%', a) = 1 AND
1 = CASE WHEN CAST(LEFT(a, 3) AS INT) BETWEEN 0 and 350 THEN 1 ELSE 0 END
输出

a
----------
030
210a
210b
240

(4 rows affected)

我不明白这个问题。您可以使用字符串:

WHERE Room.Name NOT LIKE '[0-9]%' AND
      LEFT(Room.Name, 3) BETWEEN '0' AND '350' AND  
      Room.Type = 6
然而,我怀疑你的意图是通过以下方式实现的:

WHERE Room.Name >= '000' AND
      Room.Name < '351' AND
      Room.Type = 6
WHERE Room.Name>='000'和
房间名称<'351'和
房间类型=6

这是因为您已将数字填充为零,因此字符串比较将起作用。

@SnakeFoot是的,您是对的。请注意,SQL Server 2008扩展支持将于2019年7月9日结束。thnx。很高兴知道我的office Server仍在2008年。感谢您的快速回复,但遗憾的是,它的MSSQL 2008(目前)仍在运行。我将在下周切换到MS SQL 2016时尝试它。如果它有效,我会将其标记为答案。尝试以下操作: