【问题标题】:SQL Filter numbers between x and x and ignore stringsSQL 过滤 x 和 x 之间的数字并忽略字符串
【发布时间】:2018-06-29 09:57:35
【问题描述】:

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

这是 Room.Name 的示例:

030
210a
210b
Lan-Room-A
240

我可以使用ab 使用LEFT(Rooms.Name, 3) 来处理房间名称,但是如果我想添加(LEFT(Rooms.Name, 3) BETWEEN 0 and 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 子句之前过滤掉包含字符串的行,但我不知道如何。

你们有什么想法吗?

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

提前致谢。

【问题讨论】:

    标签: sql sql-server where


    【解决方案1】:

    你可以使用TRY_CAST:

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

    DBFiddle Demo


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

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

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

    【讨论】:

    • @SnakeFoot 是的,你是对的。另请注意,SQL Server 2008 扩展支持将于 2019 年 7 月 9 日结束。
    • 谢谢。很高兴知道我的办公室服务器仍在 2008 年
    • 感谢您的快速回复,但遗憾的是它的 MSSQL 2008(目前)。我将在下周切换到 MS SQL 2016 时尝试它。如果有效,我会将其标记为答案。
    【解决方案2】:

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

    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
    

    这是因为你用零填充了数字,所以字符串比较会起作用。

    【讨论】:

      【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-13
        • 1970-01-01
        • 1970-01-01
        • 2014-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多