Sql 如何找到数字零的任何变化;0,0.0,00.00,0.000,000.0等
我使用的是oracle pl/sql,我有以下sql查询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_
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()
需要