书接上回《SQL语句where in查询括号中的字段加不加单引号''?》
提到了一种通过DESC来查询字段数据类型的方法,那么DESC运行出来结果示例究竟是怎样的,怎么能够做到呢?
首先,如何记忆?
很简单,DESC —— 即DESCRIBE的意思。顾名思义,描述一个表格。
DESC + 表名; 命令的作用是查看表结构,它会返回表中每个字段的详细信息,包括字段名、数据类型、是否可为空、键类型、默认值和额外信息。
1. DESC BC_INVOICE; 示例在 Oracle 数据库中,执行以下命令:
DESC BC_INVOICE;
示例输出(Oracle 环境):
Name Null? Type
------------------- -------- ------------
BC_INVOICE_ID NOT NULL NUMBER(19)
INVOICE_NO NOT NULL VARCHAR2(50)
INVOICE_TYPE VARCHAR2(20)
CREATED_DATE DATE
AMOUNT NUMBER(10,2)
REMARK CLOB
2. DESC命令输出解读Name
字段名(列名)
Null?
是否允许为NULL(NOT NULL表示不允许)
Type
字段的数据类型及长度(如NUMBER, VARCHAR2, DATE等)
3. 如何根据Type判断是否要加引号?在Oracle中,根据Type(数据类型)判断IN()中的值是否加引号,具体规则如下:
NUMBER
数字类型(如NUMBER,NUMBER(10,2))
纯数字
❌ 不加引号
WHERE BC_INVOICE_ID IN (7304794410654150656)
VARCHAR2/CHAR
字符串类型
字符串(即使是数字)
✅ 加引号
WHERE INVOICE_NO IN ('25327000000057799451')
DATE/TIMESTAMP
日期/时间类型
日期/时间格式
✅ 加引号
WHERE CREATED_DATE IN ('2024-01-01')
CLOB/BLOB
大字段类型(存储文本或二进制数据)
通常使用LIKE或CONTAINS等
✅ 加引号
WHERE REMARK LIKE '%重要信息%'
4. 示例代码✅ 数值类型(不加引号)字段类型为NUMBER时:
UPDATE BC_INVOICE
SET INVOICE_TYPE = 'IS'
WHERE BC_INVOICE_ID IN (7304794410654150656);
✅ 字符串类型(加引号)字段类型为VARCHAR2时:
UPDATE BC_INVOICE
SET IS_CWGX = 'Y'
WHERE INVOICE_NO IN ('25327000000057799451', '25327000000057799450');
✅ 日期类型(加引号)字段类型为DATE 时:
SELECT * FROM BC_INVOICE
WHERE CREATED_DATE IN ('2024-01-01', '2024-02-01');
5. 推荐的 Oracle 数据字典查询方法DESC在某些Oracle 工具(如SQL Developer、PL/SQL Developer)中可能受限。
推荐使用以下 SQL 查询来查看表的详细字段信息:
使用USER_TAB_COLUMNS查看字段信息SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'BC_INVOICE';
示例输出:
COLUMN_NAME DATA_TYPE DATA_LENGTH NULLABLE
---------------------------------------------------------
BC_INVOICE_ID NUMBER 19 N
INVOICE_NO VARCHAR2 50 N
INVOICE_TYPE VARCHAR2 20 Y
CREATED_DATE DATE Y
AMOUNT NUMBER 10 Y
REMARK CLOB Y