如何找到零数的任何变化; 0,0.0,00.00,0.000,000.0等

时间:2018-01-12 21:32:22

标签: sql oracle

我正在使用oracle pl / sql,我有以下sql查询。

SELECT column_1 FROM table_1
WHERE  column_1 != null
AND    column_1 != ' '
AND    column_1 != '0'
AND    column_1 != '0.0'
AND    column_1 != '00.00'
AND    column_1 != '000.000'
AND    column_1 != '0.000'
AND    column_1 != '000.0'
etc..
etc..

如您所见,column_1是一个文本字段。 我需要做的是删除零,空或空的任何变化。

无论如何都要这样做而不必用WHERE子句列出每个变体?
这样的事情是我所希望的,但对任何建议持开放态度。

SELECT column_1 FROM table_1
WHERE  column_1 != null
AND    column_1 != ' '
AND ConvertToNumberFormat(column_1) != ConvertToNumberFormat(0)

3 个答案:

答案 0 :(得分:3)

一种方法是简单地转换为数字并比较为零:

where cast(column_1 as number) = 0 or column_1 is null or column_1 = ' '

如果列可能包含非数字字符,则可能无效。在这种情况下,您可以使用正则表达式。甚至:

where regexp_like(column_1, '(0*[.])?[0]+') or column_1 is null or column_1 = ' '

答案 1 :(得分:2)

假设赋值是要排除所有完全由零组成的字符串,最多只有一个小数点,可能还有前导和/或尾随空格,这里有一种方法,它只需要标准的字符串函数(因此应该比任何正则表达式解决方案更快)。请注意,这也排除了完全由空格组成的字符串(和NULL)。

select * from table_1
where translate(trim(column_1), '.0', '.') <> '.' or trim(column_1) = '.';

说明:TRIM()将删除所有前导和尾随空格。 TRANSLATE()会将所有小数点更改为自己,它将删除(转换为空字符串)所有0,并且它将保持所有其他字符不变。如果剩下的只是一个小数点,则应排除该行。此外,如果剩下的是NULL,则应该将其排除(然后字符串全部为零,没有小数点,带或不带前导和/或尾随空格;这包括全空格和NULL的字符串,空字符串。)

现在,这也将排除一个字符串,该字符串包含所有空格,一个小数点,并且在其两侧都没有零。我认为不应该排除;这就是OR条款的WHERE部分的原因。

您可能想知道为什么TRANSLATE()需要将小数点转换为自身。它没有;但是你必须将某些东西翻译成自己,因为Oracle对NULL和空字符串有一些非常奇怪的想法; TRANSLATE(str, '0', '')会返回NULL,但它并不会删除所有零。

答案 2 :(得分:-1)

您可以使用匹配的正则表达式:

  • ^字符串的开头;然后
  • \s*零个或多个空格字符;那么
  • 0*零个或多个零个字符;然后
  • \.?零点或一点点字符;然后
  • 0*零个或多个零个字符;然后
  • \s*零个或多个空格字符;那么
  • $字符串结束。

(您需要匹配字符串的开头和结尾,否则它可以匹配400.03等子字符串。)

给出你可以使用的正则表达式^\s*0*\.?0*\s*$

Oracle安装程序

CREATE TABLE table_1 ( column_1 ) AS
SELECT ' ' FROM DUAL UNION ALL
SELECT '0' FROM DUAL UNION ALL
SELECT '0.' FROM DUAL UNION ALL
SELECT '.0' FROM DUAL UNION ALL
SELECT '0.0' FROM DUAL UNION ALL
SELECT '00.0' FROM DUAL UNION ALL
SELECT '4.0' FROM DUAL UNION ALL
SELECT '200.0' FROM DUAL UNION ALL
SELECT '.03' FROM DUAL UNION ALL
SELECT ' 00.000' FROM DUAL UNION ALL
SELECT ' 0000 ' FROM DUAL UNION ALL
SELECT NULL FROM DUAL;

<强>查询

SELECT column_1
FROM   table_1
WHERE  NOT REGEXP_LIKE( column_1, '^\s*0*\.?0*\s*$' );

<强>输出

COLUMN_1
--------
4.0
200.0
.03

您还可以创建一个用户定义的函数,将值转换为数字并处理转换中的任何异常:

Oracle安装程序

CREATE FUNCTION ValidateNumber(
  value IN VARCHAR2
) RETURN NUMBER
IS
BEGIN
  RETURN TO_NUMBER( value );
EXCEPTION
  WHEN OTHERS THEN
    RETURN NULL;
END;
/

<强>查询

SELECT column_1
FROM   table_1
WHERE  ValidateNumber( column_1 ) != 0;

<强>输出

COLUMN_1
--------
4.0
200.0
.03