Rumah pangkalan data tutorial mysql Oracle的NULL代表的含义是不确定,那么不确定的东西也会有确定的

Oracle的NULL代表的含义是不确定,那么不确定的东西也会有确定的

Jun 07, 2016 pm 03:37 PM
null oracle mewakili maksudnya

Oracle的NULL代表的含义是不确定,那么不确定的东西也会有确定的数据类型吗?或者换个说法,NULL在Oracle中的默认数据类型是什么,下面就来探讨这个问题。 首先公布答案, NULL的默认类型是字符类型,具体是VARCHAR2还是CHAR,这个并不清楚,不过我个人怀疑

Oracle的NULL代表的含义是不确定,那么不确定的东西也会有确定的数据类型吗?或者换个说法,NULL在Oracle中的默认数据类型是什么,下面就来探讨这个问题。


首先公布答案,NULL的默认类型是字符类型,具体是VARCHAR2还是CHAR,这个并不清楚,不过我个人怀疑是VARCHAR2的可能性更大一些。

我们知道一个字段不管是何种类型的,都可以插入NULL值,也就是说,NULL可以随意的转换为任意的类型。

而且,绝大部分的函数输入值为NULL,返回的结果也为NULL,这就阻止了我们通过函数的返回结果判断NULL的类型的企图。我们最常用来分析数据的DUMP函数,这回也实效了:

SQL> SELECT DUMP(NULL) FROM DUAL;

DUMP
----
NULL

而且试图通过CREATE TABLE AS来判定NULL的类型也是不可能的:

SQL> CREATE TABLE T AS SELECT TNAME, NULL COL1 FROM TAB;
CREATE TABLE T AS SELECT TNAME, NULL COL1 FROM TAB
*
ERROR 位于第 1 行:
ORA-01723: 不允许长度为 0 的列

可能有人会产生疑问,既然各种方法的行不通,你是怎么得到NULL的默认类型的?也许还有人会想,既然NULL可以隐式的转化为任意的类型,讨论NULL的默认类型是否有意义呢?

下面就是我发现NULL的数据类型的例子,同时说明了如果不注意NULL的数据类型可能会出现的问题。

由于原始的SQL过于复杂,我这里给出一个简化的例子。

SQL> create table t (id number);

表已创建。

SQL> insert into t values (1);

已创建 1 行。

SQL> insert into t values (8);

已创建 1 行。

SQL> insert into t values (0);

已创建 1 行。

SQL> insert into t values (15);

已创建 1 行。

SQL> commit;

提交完成。

需要按照T中的ID的升序显示数据,SQL如下:

SQL> select * from t order by id;

ID
----------
0
1
8
15

需求还有一点点小的要求,对于0值这个比较特殊的值,在所有非0值的后面显示。当然实现的方法比较多,比如使用UNION ALL将非0值和0值分开,或者将0值转换为一个很大的数值。

由于ID的最大值不确定,且考虑使用一个简单的SQL完成,我选择了在排序的时候将0值转化为NULL的方法,这样利用排序时NULL最大的原理,得到我希望的结果。

SQL如下:

SQL> select * from t order by decode(id, 0, null, id);

ID
----------
1
15
8
0

0值确实如我所愿排在了最后,但是结果怎么“不对”了!

SQL> select decode(id, 0, null, id) from t;

DECODE(ID,0,NULL,ID)
----------------------------------------
1
8

15

看看DECODE函数的结果,这回明白了,原来DECODE的结果变为了字符类型。字符类型结果在SQLPLUS显示左对齐,而数值类型是右对齐。

DECODE函数中,输入的4个参数中两个ID和0都是NUMBER类型,只有NULL这一个输入值类型不确定,莫非是由于NULL的类型是字符类型?

猜测只是猜测,还需要确切的证据证明这一点,下面看看标准包中DECODE函数的定义。

下面的DECODE函数定义是从STANDARD中摘取出来的部分内容:

function DECODE (expr NUMBER, pat NUMBER, res NUMBER) return NUMBER;
function DECODE (expr NUMBER,
pat NUMBER,
res VARCHAR2 CHARACTER SET ANY_CS)
return VARCHAR2 CHARACTER SET res%CHARSET;
function DECODE (expr NUMBER, pat NUMBER, res DATE) return DATE;
function DECODE (expr VARCHAR2 CHARACTER SET ANY_CS,
pat VARCHAR2 CHARACTER SET expr%CHARSET,
res NUMBER) return NUMBER;
function DECODE (expr VARCHAR2 CHARACTER SET ANY_CS,
pat VARCHAR2 CHARACTER SET expr%CHARSET,
res VARCHAR2 CHARACTER SET ANY_CS)
return VARCHAR2 CHARACTER SET res%CHARSET;
function DECODE (expr VARCHAR2 CHARACTER SET ANY_CS,
pat VARCHAR2 CHARACTER SET expr%CHARSET,
res DATE) return DATE;
function DECODE (expr DATE, pat DATE, res NUMBER) return NUMBER;
function DECODE (expr DATE,
pat DATE,
res VARCHAR2 CHARACTER SET ANY_CS)
return VARCHAR2 CHARACTER SET res%CHARSET;
function DECODE (expr DATE, pat DATE, res DATE) return DATE;

通过观察上面的定义,我们不难发现,虽然Oracle对DECODE函数进行了大量的重载,且DECODE函数支持各种的数据类型,但是DECODE函数具有一个规律,就是DECODE函数的返回值的类型和DECODE函数的输入参数中第一个用来返回的参数的数据类型一致。可能不太好理解,举个简单的例子:

SQL> select decode(id, 1, '1', 2) from t;

D
-
1
2
2
2

SQL> select decode(id, '1', 1, '2') from t;

DECODE(ID,'1',1,'2')
--------------------
1
2
2
2

从这两个简单的例子就可以看出,DECODE的返回值的数据类型和DECODE函数中第一个表示返回的参数的数据类型一致。

从这点就可以看出,NULL的默认数量类型是字符类型,这才导致DECODE的结果变成了字符串,而查询根据字符串的排序比较,因此’15’小于’8’。

知道了问题的原因,解决的方法就很多了,比如:

SQL> select * from t order by decode(id, 1, 1, 0, null, id);

ID
----------
1
8
15
0

SQL> select * from t order by to_number(decode(id, 0, null, id));

ID
----------
1
8
15
0

SQL> select * from t order by decode(id, 0, cast(null as number), id);

ID
----------
1
8
15
0

SQL> select * from t order by decode(id, 0, to_number(null), id);

ID
----------
1
8
15
0

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara memeriksa saiz meja oracle Cara memeriksa saiz meja oracle Apr 11, 2025 pm 08:15 PM

Untuk menanyakan saiz ruang meja oracle, ikuti langkah -langkah berikut: Tentukan nama meja dengan menjalankan pertanyaan: pilih Tablespace_Name dari DBA_TableSpaces; Tanya saiz meja dengan menjalankan pertanyaan: pilih jumlah (bait) sebagai total_size, jumlah (bytes_free) sebagai tersedia_space, jumlah (bytes) - jumlah (bytes_free) sebagai digunakan_space dari dba_data_files di mana tablespace_

Cara mengimport pangkalan data oracle Cara mengimport pangkalan data oracle Apr 11, 2025 pm 08:06 PM

Kaedah Import Data: 1. Gunakan utiliti SQLLoader: Sediakan fail data, buat fail kawalan, dan jalankan SQLLoader; 2. Gunakan alat IMP/EXP: data eksport, data import. Petua: 1. Disyorkan SQL*loader untuk set data besar; 2. Jadual sasaran harus wujud dan perlawanan definisi lajur; 3. Selepas mengimport, integriti data perlu disahkan.

Cara membuat jadual di oracle Cara membuat jadual di oracle Apr 11, 2025 pm 08:00 PM

Mewujudkan Jadual Oracle melibatkan langkah -langkah berikut: Gunakan sintaks Create Table untuk menentukan nama jadual, nama lajur, jenis data, kekangan, dan nilai lalai. Nama jadual harus ringkas dan deskriptif, dan tidak boleh melebihi 30 aksara. Nama lajur hendaklah menjadi deskriptif, dan jenis data menentukan jenis data yang disimpan dalam lajur. Kekangan tidak null memastikan bahawa nilai null tidak dibenarkan dalam lajur, dan klausa lalai menentukan nilai lalai untuk lajur. Kekangan utama utama untuk mengenal pasti rekod unik jadual. Kekangan utama asing menentukan bahawa lajur dalam jadual merujuk kepada kunci utama dalam jadual lain. Lihat penciptaan pelajar jadual sampel, yang mengandungi kunci utama, kekangan unik, dan nilai lalai.

Cara menyahpasang pemasangan Oracle gagal Cara menyahpasang pemasangan Oracle gagal Apr 11, 2025 pm 08:24 PM

Nyahpasang Kaedah untuk kegagalan pemasangan Oracle: Tutup Perkhidmatan Oracle, Padam Fail Program Oracle dan Kekunci Pendaftaran, Nyahpasang pembolehubah persekitaran Oracle, dan mulakan semula komputer. Jika penyahpasang gagal, anda boleh menyahpasang secara manual menggunakan alat penyahpasang Oracle Universal.

Cara menyampaikan semula oracle Cara menyampaikan semula oracle Apr 11, 2025 pm 07:33 PM

Oracle menyediakan pelbagai kaedah pertanyaan deduplikasi: Kata kunci yang berbeza mengembalikan nilai yang unik untuk setiap lajur. Kumpulan oleh klausa mengumpulkan hasil dan mengembalikan nilai tidak berulang bagi setiap kumpulan. Kata kunci yang unik digunakan untuk membuat indeks yang mengandungi hanya baris unik, dan pertanyaan indeks akan secara automatik deduplicate. Fungsi row_number () memberikan nombor unik dan menapis hasil yang mengandungi hanya baris 1. Min () atau max () mengembalikan nilai tidak berulang dari lajur angka. Operator Intersect mengembalikan nilai -nilai bersama kedua -dua set hasil (tiada pendua).

Cara melihat contoh nama oracle Cara melihat contoh nama oracle Apr 11, 2025 pm 08:18 PM

Terdapat tiga cara untuk melihat nama contoh di Oracle: Gunakan "sqlplus" dan "pilih instance_name dari v $ instance;" Perintah pada baris arahan. Gunakan "pertunjukan instance_name;" Perintah dalam SQL*Plus. Semak Pembolehubah Alam Sekitar (ORACLE_SID pada Linux) melalui Pengurus Tugas Sistem Operasi, Pengurus Oracle Enterprise, atau melalui sistem operasi.

Cara menyulitkan pandangan oracle Cara menyulitkan pandangan oracle Apr 11, 2025 pm 08:30 PM

Penyulitan Oracle View membolehkan anda menyulitkan data dalam pandangan, dengan itu meningkatkan keselamatan maklumat sensitif. Langkah -langkah termasuk: 1) mewujudkan kunci penyulitan induk (MEK); 2) mencipta pandangan yang disulitkan, menyatakan pandangan dan MEK untuk disulitkan; 3) Memberi kuasa pengguna untuk mengakses pandangan yang disulitkan. Bagaimana pandangan yang disulitkan berfungsi: Apabila permintaan pengguna untuk paparan yang disulitkan, Oracle menggunakan MEK untuk menyahsulit data, memastikan bahawa hanya pengguna yang diberi kuasa dapat mengakses data yang boleh dibaca.

Cara menambah medan meja ke oracle Cara menambah medan meja ke oracle Apr 11, 2025 pm 07:30 PM

Gunakan pernyataan ALTER Jadual, sintaks khusus adalah seperti berikut: alter table table_name Tambah column_name data_type [kekangan-klausa]. Di mana: Table_name adalah nama jadual, column_name adalah nama medan, data_type adalah jenis data, dan kekangan-fasal adalah kekangan pilihan. Contoh: Alter Table Pekerja menambah e -mel varchar2 (100) Tambahkan medan e -mel ke jadual pekerja.

See all articles