代码之家  ›  专栏  ›  技术社区  ›  user1777929

如何获取SQL Server 2014中至少有一个字段具有数字的记录?

  •  0
  • user1777929  · 技术社区  · 8 年前

    我有一个表,其中有3个电话号码字段(以及其他字段)。

    1. 白天电话
    2. 夜间电话
    3. 手机号码

    我需要调出至少有一个数字的记录。

    SELECT Field1
          ,Field2
          ,Field3
          ,DayTimePhone
          ,EveningPhone
          ,MobilePhone
    FROM Contact
    
    WHERE DayTimePhone IS NOT NULL
      AND EveningPhone IS NOT NULL
      AND MobilePhone IS NOT NULL
    

    但在一些结果中,我得到了三个字段都为空的行。它们没有空值,只有空值。因此,我的代码在一定程度上起作用。

    我试过:

      SELECT Field1, Field2, Field3
      ,CASE isnull (DayTimePhone, '-') WHEN '' THEN '-' WHEN ' ' THEN'-'
       END DayTimePhone
      ,CASE isnull (EveningPhone, '-') WHEN '' THEN '-' WHEN ' ' THEN'-'
       END EveningPhone
      ,CASE isnull (MobilePhone, '-') WHEN '' THEN '-' WHEN ' ' THEN'-'
       END MobilePhone
    
      INTO #TempTable
    --------------------------------
    SELECT * FROM #TempTable
    WHERE DayTimePhone IS NOT NULL
       AND EveningPhone IS NOT NULL
       AND MobilePhone IS NOT NULL
       AND DayTimePhone != '-'
       AND EveningPhone != '-'
       AND MobilePhone != '-'
    

    但这段代码只在字段中有NULL或-的地方给出结果。

    如果三个字段中的任何一个字段中至少有一个数字,如何获得结果?

    编辑

    请参阅我对@长答案的评论。该解决方案奏效了,但现在的结果也显示了DayTimePhone读取0的行。请阅读我下面的评论。

    4 回复  |  直到 8 年前
        1
  •  2
  •   Edmond Quinton    8 年前

    另一种选择是只检查表示数字的字符串的长度。如果为null或太短,则只需将其从结果中排除。

    SELECT * FROM #TempTable
    WHERE   (
                (ISNULL(LEN(RTRIM([DayTimePhone])), 0) > 8)   
                    OR 
                (ISNULL(LEN(RTRIM([EveningPhone])), 0) > 8) 
                    OR 
                (ISNULL(LEN(RTRIM([MobilePhone])), 0) > 8) 
            )
    
        2
  •  1
  •   LONG    8 年前

    尝试:

    SELECT * FROM #TempTable
    WHERE (DayTimePhone IS NOT NULL AND REPLACE(DayTimePhone,' ','') != '')
       OR (EveningPhone IS NOT NULL AND REPLACE(EveningPhone ,' ','') != '')
       OR (MobilePhone IS NOT NULL AND REPLACE(MobilePhone ,' ','') != '')
    

    使用blank并不总是一个好的表设计,请尝试使用 NULL

    更新时间: 根据您的评论,您能指出哪种类型吗 0 是电话吗?

    如果在结果中仍然看到“0”,则表示这绝对不是一个 0 。

    你可以跟我一起去 WHERE DayTimePhone != '0-0-0' or DayTimePhone != '0-0' ,但这不是 skeleton key 。如果您正在检查 U.S 电话号码,您可以使用验证美国电话号码并使用 LIKE ,“[0-9]”,要检查这样的表达式模式。我将尝试为您提供一种检查验证美国电话查询的一般方法。

        3
  •  1
  •   Gordon Linoff    8 年前

    一个非常简单的方法是:

    SELECT tt.*
    FROM #TempTable tt
    WHERE tt.DayTimePhone <> '-' OR
          tt.EveningPhone <> '-' OR
          tt.MobilePhone <> '-';
    

    NULL 对于 <> 比较

        4
  •  1
  •   Kim Lage    8 年前

    您应该首先清除表中的空值和空白值。 实际上已经完成了。现在需要使用OR命令而不是AND命令,并检查替换的值(“-”):

    SELECT * FROM #TempTable
    WHERE (DayTimePhone IS NOT NULL != '-')
    OR (EveningPhone IS NOT NULL  != '-')
    OR (MobilePhone IS NOT NULL  != '-')
    

    我希望它能帮助。。。