我正在使用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)
答案 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