在 oracle 的 table 中插入数据时如何避免 space(s)
How to avoid space(s) while inserting data in a table in oracle
我想避免在 table 的列中使用前导空格和尾随空格。我尝试使用以下检查约束但显示错误 - "invalid relational operator".
alter table employee add (CONSTRAINT trm_name check(trim(name)));
alter table employee add (CONSTRAINT trm_name check(trim(dept)));
假设,我有一名 table 员工,并且希望在两列(名称和部门)上没有前导和尾随空格。谁能帮帮我。
此致,
塔拉克
您可以使用触发器:
CREATE OR REPLACE TRIGGER EMPLOYEE_BIU
BEFORE INSERT OR UPDATE ON EMPLOYEE
FOR EACH ROW
BEGIN
:NEW.DEPT := TRIM(:NEW.DEPT);
END EMPLOYEE_BIU;
您可以使用 CHECK
约束,如下所示:
SQL> CREATE TABLE ABC (
2 NAME VARCHAR2(100) CHECK ( NAME = TRIM(NAME) ), -- use CHECK constraint
3 DEPT VARCHAR2(100) CHECK ( DEPT = TRIM(DEPT) ) -- use CHECK constraint
4 );
Table created.
SQL> -- space in name
SQL> INSERT INTO ABC VALUES (' TEJASH ','SO');
INSERT INTO ABC VALUES (' TEJASH ','SO')
*
ERROR at line 1:
ORA-02290: check constraint (TEJASH.SYS_C0014819) violated
SQL> -- space in department
SQL> INSERT INTO ABC VALUES ('TEJASH1',' SO');
INSERT INTO ABC VALUES ('TEJASH1',' SO')
*
ERROR at line 1:
ORA-02290: check constraint (TEJASH.SYS_C0014820) violated
SQL> -- valid record
SQL> INSERT INTO ABC VALUES ('TEJASH1','SO');
1 row created.
SQL>
我假设,特别是,您不希望在这些列中允许非空字符串 完全 空格。
如果是这样,我会用 decode
编写约束,它处理 NULL
约束所需的方式(其中像 NULL=something
这样的等式被视为与 TRUE
- 与 WHERE
子句或连接条件中的相同等式不同,后者的处理方式与 FALSE
).
相同
例如:
alter table employee
add (CONSTRAINT trm_name check(decode(name, trim(name), 1, 0) = 1));
decode
returns 1
当且仅当名称为 NULL
或 名称为非 NULL
并且它没有前导或尾随空格。在所有其他情况下它 returns 0
- 如果 name
都是空格,那么 trim(name)
是 NULL
,name
不是 NULL
, 所以 decode
returns 0
并且约束是 FALSE
.
注意我们经常把条件写成decode(a, b, 1) = 1
的形式(decode
的默认return值是NULL
,所以这样就可以在WHERE
个子句和连接条件 )。在constraints中,NULL = 1
和TRUE
一样处理,所以这个shorthand就不行了;当 a
和 b
不同时,我们必须在 decode
中给出一个非 NULL
的值。
我想避免在 table 的列中使用前导空格和尾随空格。我尝试使用以下检查约束但显示错误 - "invalid relational operator".
alter table employee add (CONSTRAINT trm_name check(trim(name)));
alter table employee add (CONSTRAINT trm_name check(trim(dept)));
假设,我有一名 table 员工,并且希望在两列(名称和部门)上没有前导和尾随空格。谁能帮帮我。
此致, 塔拉克
您可以使用触发器:
CREATE OR REPLACE TRIGGER EMPLOYEE_BIU
BEFORE INSERT OR UPDATE ON EMPLOYEE
FOR EACH ROW
BEGIN
:NEW.DEPT := TRIM(:NEW.DEPT);
END EMPLOYEE_BIU;
您可以使用 CHECK
约束,如下所示:
SQL> CREATE TABLE ABC (
2 NAME VARCHAR2(100) CHECK ( NAME = TRIM(NAME) ), -- use CHECK constraint
3 DEPT VARCHAR2(100) CHECK ( DEPT = TRIM(DEPT) ) -- use CHECK constraint
4 );
Table created.
SQL> -- space in name
SQL> INSERT INTO ABC VALUES (' TEJASH ','SO');
INSERT INTO ABC VALUES (' TEJASH ','SO')
*
ERROR at line 1:
ORA-02290: check constraint (TEJASH.SYS_C0014819) violated
SQL> -- space in department
SQL> INSERT INTO ABC VALUES ('TEJASH1',' SO');
INSERT INTO ABC VALUES ('TEJASH1',' SO')
*
ERROR at line 1:
ORA-02290: check constraint (TEJASH.SYS_C0014820) violated
SQL> -- valid record
SQL> INSERT INTO ABC VALUES ('TEJASH1','SO');
1 row created.
SQL>
我假设,特别是,您不希望在这些列中允许非空字符串 完全 空格。
如果是这样,我会用 decode
编写约束,它处理 NULL
约束所需的方式(其中像 NULL=something
这样的等式被视为与 TRUE
- 与 WHERE
子句或连接条件中的相同等式不同,后者的处理方式与 FALSE
).
例如:
alter table employee
add (CONSTRAINT trm_name check(decode(name, trim(name), 1, 0) = 1));
decode
returns 1
当且仅当名称为 NULL
或 名称为非 NULL
并且它没有前导或尾随空格。在所有其他情况下它 returns 0
- 如果 name
都是空格,那么 trim(name)
是 NULL
,name
不是 NULL
, 所以 decode
returns 0
并且约束是 FALSE
.
注意我们经常把条件写成decode(a, b, 1) = 1
的形式(decode
的默认return值是NULL
,所以这样就可以在WHERE
个子句和连接条件 )。在constraints中,NULL = 1
和TRUE
一样处理,所以这个shorthand就不行了;当 a
和 b
不同时,我们必须在 decode
中给出一个非 NULL
的值。