介于x和x之间的SQL筛选器编号并忽略字符串
我在SQL Server中有一个表,需要按名称和类型筛选房间。问题是,名称存储为介于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。我
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时尝试它。如果它有效,我会将其标记为答案。尝试以下操作: