Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何找到数字零的任何变化;0,0.0,00.00,0.000,000.0等_Sql_Oracle - Fatal编程技术网

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

Sql 如何找到数字零的任何变化;0,0.0,00.00,0.000,000.0等,sql,oracle,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_

我使用的是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..
如您所见,列_1是一个文本字段。 我需要做的是删除任何零、null或空的变量

这样做是否不必用WHERE子句列出每个单独的变更?
像这样的事情正是我所希望的,但我愿意接受任何建议

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

一种方法是简单地转换成一个数字并与零进行比较:

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 = ' '

一种方法是简单地转换成一个数字并与零进行比较:

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 = ' '

可以使用与以下内容匹配的正则表达式:

  • ^
    字符串的开头;然后
  • \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
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
查询

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
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
输出

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
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
您还可以创建一个用户定义函数,将值转换为数字,并处理转换过程中的任何异常:

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
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
查询

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
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
输出

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
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

可以使用与以下内容匹配的正则表达式:

  • ^
    字符串的开头;然后
  • \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
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
查询

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
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
输出

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
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
您还可以创建一个用户定义函数,将值转换为数字,并处理转换过程中的任何异常:

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
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
查询

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
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
输出

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
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

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

从表1中选择*
其中translate(trim(column_1)、'.0'、'.')或trim(column_1)=';
说明:
TRIM()
将删除所有前导和尾随空格
TRANSLATE()
将所有小数点更改为自身,将删除(转换为空字符串)所有0,并保留所有其他字符不变。如果只剩下一个小数点,则应排除该行。此外,如果剩下的是NULL,则应将其排除在外(然后字符串为全零,没有小数点,有或没有前导和/或尾随空格;这包括所有空格的字符串以及空字符串
NULL

现在,这也将排除一个包含所有空格、一个小数点且两边都没有零的字符串。我认为这不应该被排除在外;这就是为什么在
WHERE
子句中有
部分


您可能想知道为什么
TRANSLATE()
需要将小数点转换为自身。事实并非如此;但您必须将某些内容转换为自身,因为Oracle对
NULL
和空字符串有一些非常奇怪的想法
TRANSLATE(str,'0','')
返回
NULL
,它不只是将所有的零都清除。

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

从表1中选择*
其中translate(trim(column_1)、'.0'、'.')或trim(column_1)=';
说明:
TRIM()
将删除所有前导空格和尾随空格。
TRANSLATE()
将所有小数点更改为自身,并将删除(转换为空字符串)所有0,它将保留所有其他字符不变。如果只剩下一个小数点,则应排除该行。如果剩下的为空,则应排除该行(然后字符串是全零,没有小数点,有或没有前导和/或尾随空格;这包括所有空格的字符串以及空字符串
NULL

现在,这也将排除一个包含所有空格、一个小数点和两边都没有零的字符串。我假设不应该排除它;这就是为什么
WHERE
子句中有
部分

您可能想知道为什么
TRANSLATE()
需要