【问题标题】:select query to identify numeric or alphanumeric values选择查询以识别数字或字母数字值
【发布时间】:2018-07-29 07:24:06
【问题描述】:

我有一张如下表:

  TN  Tier
  90   1
  90   N3
  30   2
  40   3
  50   A

“Tier”列可以包含任何 TN 的数字和字母数字值。我想在上表上运行选择查询,这样如果对于任何 TN,Tier 列中同时存在(数字和字母数字)值,那么它应该被称为“混合”,否则应该被称为“数字”或“非数字” ”。

期望的输出:

 TN   Result
 90    Mix
 30   Numeric
 40   Numeric
 50   Non-Numeric

我可以通过使用多个临时表来实现它,但我想避免使用临时表。任何帮助将不胜感激!!!

【问题讨论】:

  • 对于 sql 服务器:sqlfiddle.com/#!18/07c44/4
  • 请告诉我们您使用的是 MySQL 还是 SQL Server,以及您为什么使用两个截然不同的数据库进行标记?
  • @TimBiegeleisen 感谢您的回复...我需要在 sql server 中运行该查询,这是错误的。对此感到抱歉..

标签: sql sql-server sql-server-2008 select


【解决方案1】:

我希望,你正在使用 mysql。最好能像下面这样写一个自定义函数。

delimiter //
CREATE FUNCTION is_numeric(inputValue VARCHAR(50))
  RETURNS INT
  BEGIN
    IF (inputValue REGEXP ('^[0-9]+$'))
    THEN
      RETURN 1;
    ELSE
      RETURN 0;
    END IF;
  END;

Example - select is_numeric(id),is_numeric(full_name) FROM tbl_user;

【讨论】:

    【解决方案2】:

    对于 MySQL,使用 REGEXPCASE 表达式:

    SELECT
        TN,
        CASE WHEN SUM(CASE WHEN Tier REGEXP '[A-Z]' AND Tier REGEXP '[0-9]'
                           THEN 1 ELSE 0 END) > 0 THEN 'Mix'
             WHEN SUM(CASE WHEN Tier REGEXP '[A-Z]'
                           THEN 1 ELSE 0 END) > 0 THEN 'Non-Numeric'
             WHEN SUM(CASE WHEN Tier REGEXP '[0-9]'
                           THEN 1 ELSE 0 END) > 0 THEN 'Numeric'
             ELSE 'Other' END AS Result
    FROM yourTable
    GROUP BY
        TN;
    

    对于 SQL Server,您可以通过使用带有适当模式的 LIKE 来稍微更改上述查询:

    SELECT
        TN,
        CASE WHEN SUM(CASE WHEN Tier LIKE '%[A-Z]%' AND Tier LIKE '%[0-9]%'
                           THEN 1 ELSE 0 END) > 0 THEN 'Mix'
             WHEN SUM(CASE WHEN Tier LIKE '%[A-Z]%'
                           THEN 1 ELSE 0 END) > 0 THEN 'Non-Numeric'
             WHEN SUM(CASE WHEN Tier LIKE '%[0-9]%'
                           THEN 1 ELSE 0 END) > 0 THEN 'Numeric'
             ELSE 'Other' END AS Result
    FROM yourTable
    GROUP BY
        TN;
    

    @JohnWoo 给出的 SQL Server 答案比这更严格,但正如你用 MySQL 标记的那样,我最初是为这个数据库回答的。

    【讨论】:

      【解决方案3】:

      你不需要任何大的查询,它可以很简单,

      试试这个:

      Select * from table
      

      然后您可以在while循环中检查您的列的值,每次您可以搜索记录中具有数字或没有数字的字符串。

      $string = $row['Tier'];
      if (preg_match('/[A-Za-z]/', $myString) )
      {     
         echo 'String contains letters';   
      }
      else if(preg_match('/[0-9]/', $myString))
      {
          echo 'String contains numbers';
      }else if($string == '')
      {
          echo 'String contains no letter and no number';
      }
      

      【讨论】:

        【解决方案4】:

        您可以在SQL Server 中使用ISNUMERIC() 功能。

        SELECT [TN],
               CASE MAX(ISNUMERIC(Tier)) + MIN(ISNUMERIC(Tier))
                    WHEN 2 THEN 'Numeric'
                    WHEN 1 THEN 'Mix'
                    ELSE 'Non-Numeric'
               End As Result
        FROM TableName
        GROUP BY TN
        

        这是Demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-08
          • 2016-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-16
          相关资源
          最近更新 更多