【问题标题】:Insert into table only if numeric in SQL仅当 SQL 中为数字时才插入表中
【发布时间】:2013-08-27 12:24:44
【问题描述】:

我有一个这样的插入查询

INSERT INTO tbl_LandRigs (Company,Rig,[RigType] ,[DrawWorks],[TopDrive] ) VALUES 
(@Company,@Rig,@RigType ,@DrawWorks,@TopDrive )

现在我需要的是,我只想在数据是数字的情况下将数据插入到列TopDrive。否则我想在该列中插入“0”。在 SQL 中可以吗?

【问题讨论】:

  • TopDrive 列是什么数据类型?你想只接受整数还是任何形式的数字?
  • 相反,您可以在前端本身验证以仅接受数字..

标签: sql sql-server-2008


【解决方案1】:
INSERT INTO tbl_LandRigs ([Company], [Rig], [RigType], [DrawWorks], [TopDrive])
VALUES (@Company, @Rig, @RigType, @DrawWorks, CASE WHEN ISNUMERIC(@TopDrive) = 1 THEN @TopDrive ELSE 0 END)

在这里,我们将充分利用 CASE 和 ISNUMERIC。

此外,它通常使其他开发人员(或以后的您自己)更容易与您对括号和空格的使用保持一致,即使在 SQL 代码中也是如此。

正如其他人所提到的,isnumeric 可能会给你一些false positives。如果可能的话,通常最好在输入进入数据库之前对其进行清理,在这种情况下可能不使用无类型数据。只有您知道您的输入,但如果您预计会出现问题,there are some options。

【讨论】:

    【解决方案2】:

    您可以在 SQL Server 中调用 IsNumeric() 函数。不过要小心科学记数法...

    【讨论】:

    【解决方案3】:

    请看这个:

    IF Isnumeric(@TopDrive) = 1 
      BEGIN 
          INSERT INTO TBL_LANDRIGS 
                      (COMPANY, 
                       RIG, 
                       [RIGTYPE], 
                       [DRAWWORKS], 
                       [TOPDRIVE]) 
          VALUES      (@Company, 
                       @Rig, 
                       @RigType, 
                       @DrawWorks, 
                       @TopDrive ) 
      END 
    ELSE 
      BEGIN 
          INSERT INTO TBL_LANDRIGS 
                      (COMPANY, 
                       RIG, 
                       [RIGTYPE], 
                       [DRAWWORKS], 
                       [TOPDRIVE]) 
          VALUES      (@Company, 
                       @Rig, 
                       @RigType, 
                       @DrawWorks, 
                       0 ) 
      END 
    

    如果有任何帮助,请更新

    【讨论】:

    • 抵消维护两个插入语句有好处吗?
    • @TimLehner:不,绝对不是,如果你问我,我会选择你的答案:-D!
    【解决方案4】:

    在插入 sql 之前,您检查它是否编号检查这个link

    bool status;
    NSScanner *scanner;
    NSString *testString;
    double result;
    
    scanner = [NSScanner scannerWithString:testString];
    status = [scanner scanDouble:&result];
    status = status && scanner.scanLocation == string.length;
    

    如果 status == YES 则字符串是全数字的。

    或者正如@Dave 从这个 SO 答案中指出的那样:

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    number = [formatter numberFromString:string];
    status = number != nil;
    

    【讨论】:

      【解决方案5】:

      如果您只检查数字(无小数),请使用like '%[^0-9]%',如下所示;

      Insert into tbl_LandRigs (Company, Rig, [RigType], [DrawWorks], [TopDrive] ) 
      Values (@Company, @Rig, @RigType, @DrawWorks,
              Case when @TopDrive like '%[^0-9]%' then 0 else @TopDrive end )
      

      请注意ISNUMERIC(),因为它会为某些非数字字符(例如加号 (+)、减号 (-))和有效的货币符号(例如美元符号 ($))返回 1。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-01
        • 1970-01-01
        • 2013-05-03
        • 2016-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多