【问题标题】:SQL Query - SELECT all rows except where value in column begins with 402 or 403 or A40SQL 查询 - 选择除列中的值以 402 或 403 或 A40 开头的所有行
【发布时间】:2010-07-13 08:57:44
【问题描述】:

我有一个无法控制的 (MS) SQL VIEW,它还查询其他几个我也无法控制但必须使用的 SQL VIEW。

根据“试验”值获取所有行,但以 402 或 403 或 A40 开头的行除外。只要所有“试点”条目都可以解释为 INT,这就是当前运行良好的查询。

SELECT * from sqlsrvlink.DATABASE.dbo.V_PILOT_GENERAL WHERE NOT LEFT(pilot,3) IN ('402','403')

pilot 应该始终是一个 INT,但 SQL 设计还有很多不足之处,它被实现为一个 VARCHAR。因此,对于没有输入格式检查的 3:rd 方应用程序,可以“配置”“pilot”列以不包含任何数值,在这种情况下,我的 SELECT 语句将失败并显示错误消息:

消息 245,第 16 级,状态 1,第 1 行 将 varchar 值“A406XX”转换为数据类型为 int 的列时出现语法错误。

如何扩展 SELECT 以排除 A40,但主要通过排除或直接忽略它们(无数值)来解决“将 VARCHAR 转换为 INT 的错误”。

【问题讨论】:

    标签: sql select


    【解决方案1】:
    SELECT * from sqlsrvlink.DATABASE.dbo.V_PILOT_GENERAL
    WHERE pilot NOT LIKE '402%' AND pilot NOT LIKE '403%' AND pilot NOT LIKE 'A40%'
    

    应该更好地利用试验中的任何索引

    编辑

    根据您的评论,我想我最初误解了这个问题。问题不在于 SELECT 语句本身,而更多是当基表中存在无效数据时,任何尝试访问违规行中的该列都会导致错误,如下所示。

    CREATE VIEW [dbo].[testing] 
    AS
    SELECT 1 AS [Number]
          ,'X' AS Letter
      union all
    SELECT 'bob' AS [Number]
          ,'Y' AS Letter
      union all
    SELECT 3 AS [Number]
          ,'Z' AS Letter
    GO
    
    SELECT * /*Works*/
    FROM  [dbo].[testing] 
    WHERE Letter IN ('X', 'Z')
    
    SELECT CAST([Number] AS varchar(10)) /*Error Occurs*/
    FROM  [dbo].[testing] 
    

    我不知道在不更改视图定义(您说您不能这样做)或更改基础数据或重写查询以不使用视图的情况下避免这种情况的任何方法。您将无法对该列进行过滤以删除可疑记录,因为尝试在过滤器中使用它只会导致错误发生。

    【讨论】:

    • 这通常可以工作,不幸的是错误消息仍然出现并且查询停止。
    • 在您的编辑之后。是的,你完全正确,我会走很长的路来争取改变原来的 VIEW,谢谢。
    【解决方案2】:

    这可能没问题。我认为您的“NOT”向左徘徊了一点......

    SELECT *
        FROM sqlsrvlink.DATABASE.dbo.V_PILOT_GENERAL
        WHERE LEFT(pilot,3) NOT IN ('402','403', 'A40');
    

    【讨论】:

      【解决方案3】:

      这样的事情呢?这应该适用于字符串/文本字段。 SELECT * from sqlsrvlink.DATABASE.dbo.V_PILOT_GENERAL WHERE pilot not like(402%) or ...

      【讨论】:

        猜你喜欢
        • 2013-08-06
        • 2018-08-24
        • 2010-09-13
        • 1970-01-01
        • 2019-10-07
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        相关资源
        最近更新 更多