當前位置:首頁 » 數據倉庫 » 資料庫coalesce
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫coalesce

發布時間: 2022-10-23 22:48:30

⑴ Oracle的COALSECE什麼函數

COALESCE
含義:COALESCE是一個函數, (expression_1, expression_2, ...,expression_n)依次參考各參數表達式,遇到非null值即停止並返回該值。如果所有的表達式都是空值,最終將返回一個空值。使用COALESCE在於大部分包含空值的表達式最終將返回空值。
用法:COALESCE(expression_1, expression_2, ...,expression_n)
例子
1.SELECT COALESCE(NULL,NULL,3,4,5) FROM al
其返回結果為:3
2.SELECT A.ID,SUM(COALESCE(A.SHUL,0)+COALESCE(A.PZSHUL,0)) from t_order as A group by A.ID
這樣就不會因為資料庫中的值為NULL而計算錯誤
返回值:返回第一個非NULL表達式的類型
擴展
COALESCE(expression1,...n) 與此 CASE 函數等價:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
...
WHEN (expressionN IS NOT NULL) THEN expressionN
ELSE NULL
注意
空值加任何值都是空值,空值 乘任何值也都是空值,依此類推。
所有表達式必須是相同類型,或者可以隱性轉換為相同的類型

⑵ oracle 索引什麼時候重建和重建方法討論

Normal 0 7.8 pt 0 2 false false false MicrosoftInternetExplorer4
oracle 索引什麼時候重建和重建方法討論
分類:資料庫技術 字型大小: 大大中中小小 索引什麼時候需要重建和重建的方法
一提到索引,大家都知道,但是怎樣建索引,什麼時候重建索引,重建索引用什麼方法,可能有的就不太清楚了,我根據一些資料簡單的整理一點,如果哪裡不對或是不妥請大家指點,希望大家有更好經驗也share出來。
索引的目的是為了加快尋找數據的速度,但是如果對表經常做改動,則索引也會相應改動,時間長了,查詢速度的效率就會降低,就有可能要重建索引,那麼什麼時候需要重建索引和用什麼方法重建索引可能是大家關心的。
一. 索引在內部進行自身的管理以確保對數據行的快速訪問。但是數據表中大量的活動會導致oracle索引動態地對自身的進行重新配置,這些配置包括三個方面:
1.索引分割
當新數據行產生的索引節點要建立在現有級別上時,出現此動作。
2.索引生成
在某些位置,索引達到此級索引的最大容量的時候,就會生成更深一級的索引結構。
3.索引節點的刪除
你可能了解到,刪除表中的數據行後,索引中相應的節點不會從物理意義上刪除,也沒有從索引中刪除此項目。而是從邏輯上刪除此索引項目,並在索引樹中留下了一個「死「節點,當索引刪除了葉節點或是生成了過深的的級別層次後,就需要進行重建。
二 索引的種類:
a.B-tree(B樹)索引
b.壓縮B樹索引
c.Bitmap(點陣圖)索引
d.函數索引
e.Reverse Key Index(反向鍵索引)
f.Index Organized Table(索引組織表)
三 下面分別對各種索引進行說明
在進行介紹前先說明幾個術語:
高基數:簡單理解就是表中列的不同值多
低基數:建單理解就是表中的列的不同值少
以刪除的葉節點數量:指得是數據行的delete操作從邏輯上刪除的索引節點的數量,要記住oracle在刪除數據行後,將「死「節點保留在索引中,這樣做可以加快sql刪除操作的速度,因此oracle刪除數據行後可以不必重新平衡索引。
索引高度:索引高度是指由於數據行的插入操作而產生的索引層數,當表中添加大量數據時,oracle將生成索引的新層次以適應加入的數據行,因此, oracle索引可能有4層,但是這只會出現在索引數中產生大量插入操作的區域。Oracle索引的三層結構可以支持數百萬的項目,而具備4層或是更多層的需要重建。
每次索引訪問的讀取數:是指利用索引讀取一數據行時所需要的邏輯I/O操作數,邏輯讀取不必是物理讀取,因為索引的許多內容已經保存在數據緩沖區,然而,任何數據大於10的索引都需要重建。
1. B-tree(B樹)索引
是現代關系型資料庫中最常用的索引。除了存儲索引數據外,還存儲一個行ID,用來指出該行其餘數據存儲在這個被索引表中的什麼地方。該索引以一種數結構格式存儲這些值。
Oracle建議如果表經過排序,當返回40%一下的數據時使用索引,如果高於40%則使用全表掃描,如果沒有經過排序,則當返回7%以下時,使用索引。看錶是否排序,可以看dba_indexes字典中的CLUSTERING_FACTOR列,如果與表佔用的數據塊數相近,則經過了排序,如果與行數相近,則沒有排序。那麼什麼時候重建呢?我們可以利用analyze index …….. compute statistics 對表進行分析。然後察看dba_indexes中的blevel。這列是說明索引從根塊到葉快的級別,或是深度。如果級別大於等於4。則需要重建,如下:
Select index_name,blevel from dba_indexeswhere blevel>=4.
另一個從重建中受益的指標顯然是當該索引中的被刪除項占總的項數的百分比。如果在20%以上時,也應當重建,如下
SQL>anlyze index ------ validatestructure
SQL>select(del_lf_rows_len/lf_rows_len)*100 from index_stats where 刪除並從頭開始建立索引。
b. 使用alter index -------- rebuild 命令重建索引
c. 使用alter index -------- coalesce命令重建索引。
下面討論一下這三種方法的優缺點:
1).刪除並從頭開始建索引:方法是最慢的,最耗時的。一般不建議。
2).Alter index ---- rebuild 快速重建索引的一種有效的辦法,因為使用現有索引項來重建新索引,如果客戶操作時有其他用戶在對這個表操作,盡量使用帶online參數來最大限度的減少索引重建時將會出現的任何加鎖問題,alter index ------- rebuild online.但是,由於新舊索引在建立時同時存在,因此,使用這種技巧則需要有額外的磁碟空間可臨時使用,當索引建完後把老索引刪除,如果沒有成功,也不會影響原來的索引。利用這種辦法可以用來將一個索引以到新的表空間。
Alter index ------ rebuild tablespace -----。
這個命令的執行步驟如下:
首先,逐一讀取現有索引,以獲取索引的關鍵字。
其次,按新的結構填寫臨時數據段。
最後,一旦操作成功,刪除原有索引樹,降臨時數據段重命名為新的索引。
需要注意的是alterindex ---rebuild 命令中必須使用tablespace字句,以保證重建工作是在現有索引相同的表空間進行。
3).alter index ----- coalesce 使用帶有coalesce參數時重建期間不需要額外空間,它只是在重建索引時將處於同一個索引分支內的葉塊拼合起來,這最大限度的減少了與查詢過程中相關的潛在的加鎖問題,但是,coalesce選項不能用來講一個索引轉移到其他表空間。
2.壓縮B樹索引
當B樹索引基於大表時,尤其是當基於數據倉庫或決策支持系統中的大表時,這些索引會耗費大量的存儲空間,壓縮(compressed)B樹索引用來最大限度的減少某些類型的B樹索引使用的空間。當一個B樹索引得到壓縮時,被索引的獵的重復出現就被消除掉,進而減少了存儲索引的總的存儲空間。例如:
壓縮前:smith每次出現還要存儲它的相關的rowid.
姓 關聯rowid
smith AAABSOAAEAAAABTAAB
smith AAABSOAAEAAAABTAAC
smith AAABSOAAEAAAABTAAD
壓縮後:smith項和rowid指存儲一次。
smith AAABSOAAEAAAABTAAB,AAABSOAAEAAAABTAAB, AAABSOAAEAAAABTAAB
創建方法:
SQL>create index index_name ontable_name(column_name)
tablespace tablespace_name
compress;
另一種方法:
SQL>alter index index_name rebuildcompress;
3. itmap(點陣圖)索引。
B樹索引在數據具有高基數的列工作的最好,對於低基數的列,點陣圖索引可能是更有效的選擇。點陣圖索引創建錶行的一個二進制映像,並把映像存儲在索引塊中,這種類型的索引的DML操作少,長度大並且含有極少不同的值得列特別有用。點陣圖索引不應當用在頻繁發生insert,update,delete操作的表上,這些dml操作在性能方面的代價很高,因為,他們會引起點陣圖級的加鎖發生,而且要求動態的重建所有可能值的點陣圖。為圖索引最適合數據倉庫和決策支持系統。
4.基於函數的索引
當把一個函數運用於被索引的列上時,該列德索引都變得無效,基於函數的索引就是為了解決這個問題。
5.反向鍵索引
是一種特殊類型的B樹索引,在索引基於含有序數的列時使非常有用的,如果一個傳統的B樹索引基於一個含有這種數據的列,往往會產生許多級,由於B樹索引有 4級以上的深度會降低性能,因此反向鍵索引更適合這種類型,反向鍵索引通過簡單的煩象被索引的列中的數據來解決問題,他首先反向每個列鍵值的位元組,然後在反向後的新數據上進行索引,而新數據在值的范圍上的分布通常比原來的有序數更均勻。
6.索引組織表
由於B樹、點陣圖、反向鍵索引的使用而引起的性能將會導致這樣的事實,這些索引中的項目直接指向索引基表中對應數據的行ID,這是從錶行沒有按任何特定的順序來物理地存儲表中檢索錶行的一種有效方法,這種表叫做堆表,oracle大多數表中以一種堆疊方式存儲行數據,因為行以一種或多或少的隨機方式被分配給表內的塊,之所以出現這種隨機性,是因為oracle在決定把一個行存儲在何處時並不考慮改行的內容,oracle只是把該行存儲在它從該表的freelist 上所發現的第一個塊中。
如果希望按一種指定順序來存儲一個表的數據,就不能使用堆表,為此oracle提供了索引組織表,索引組織表不是存儲一個指向行數據的其餘部分存儲在了何處的行的ID指針,而是把行數據全部存儲在索引本身內,這產生了兩個性能好處:
n 錶行按索引順序來存儲。
n 使用B樹索引時引起的先讀取索引後讀取表鎖使用的額外I/O操作得到消除。
例如:
sql>create table emp
(last_name varchar2(9) primary key,
first_name varchar2(9),
hire_date date)
organization index tablespace users
pctthreshold 25
including first name
overflow tablespace qyl
mapping table;
所有索引組織表在將要作為索引基礎的那一列上都必須有一個主鍵約束,索引組織表不能含有唯一性約束或是被聚簇。
下面說明各個參數的含義:
organization index:說明該表是索引組織表
pctthreshold :指定整個數據塊的什麼百分比要保持打開,以便存儲一個與主鍵值相關聯的行數據,其中主鍵值必須在0到50之間(50是默認值)
including : 指定在行長度超過pctthershold中所設置的大小時按那一列 把行分解成兩段
overflow tablespace :指定在行長度超過pctthreshold中設置的大小時行數的的另一部分存儲到的表空間。
Mapping table:致使在創建索引組織表的點陣圖索引時所必需的一個關聯映像表的創建。
以上是我根據一些資料對索引的一個簡單闡述,大家可能有不同的見解,希望對大家有幫助,那些不妥的地方還希望大家提出來。
參考資料:ocp困惑racle9i性能調整
oracle statspack 高性能調整技術
[@more@]
analyze index t_id_ind validate structure
select (del_lf_rows_len/lf_rows_len)*100 from index_stats
>20%
b. 使用alter index t_id_ind rebuild 命令重建索引
c. 使用alter index t_id_ind coalesce命令重建索引。
alter indext_id_ind rebuild online.
但是,由於新舊索引在建立時同時存在,因此,使用這種技巧則需要有額外的磁碟空間可臨時使用,當索引建完後把老索引刪除,如果沒有成功,也不會影響原來的索引。利用這種辦法可以用來將一個索引以到新的表空間。
Alter index ------ rebuild tablespace -----。
這個命令的執行步驟如下:
首先,逐一讀取現有索引,以獲取索引的關鍵字。
其次,按新的結構填寫臨時數據段。
最後,一旦操作成功,刪除原有索引樹,降臨時數據段重命名為新的索引。
需要注意的是alter index ---rebuild 命令中必須使用tablespace字句,以保證重建工作是在現有索引相同的表空間進行
alter index ----- coalesce 使用帶有coalesce參數時重建期間不需要額外空間,它只是在重建索引時將處於同一個索引分支內的葉塊拼合起來,這最大限度的減少了與查詢過程中相關的潛在的加鎖問題,但是,coalesce選項不能用來講一個索引轉移到其他表空間

⑶ 在線等SQL資料庫怎麼過濾空字元

nvl(col,'')
coalesce(col1,col2)
isnull(col,'')
空值轉換函數 或者 要過濾數據的話
where col is null or col = ''

⑷ sql查詢沒有數據的時候怎麼用0填充

這樣:

SELECT

a.dt AS '時間',

ISNULL(b.yield, '0') AS '數據'

FROM

(

SELECT

dateadd(d, number, '2018-11-01') dt

FROM

master..spt_values

WHERE

type = 'p'

AND dateadd(d, number, '2018-11-01') <= '2018-11-30'

) a

LEFT JOIN CE_BD_E_ELECTRIC_WORKSHIFT_T b ON a.dt = b.opdate

(4)資料庫coalesce擴展閱讀:

注意事項

COALESCE是一個函數, (expression_1, expression_2, …,expression_n)依次參考各參數表達式,遇到非null值即停止並返回該值。如果所有的表達式都是空值,最終將返回一個空值。使用COALESCE在於大部分包含空值的表達式最終將返回空值。

場景一:你想要獲取最大值,然後+1返回(即返回的值已經默認為空了),程序接收了本來不該為空的值去運算,就會出錯。

SELECT MAX(my_money)+1 FROM tb_test;

改進方法:使用 coalesce函數 COALESCE(值1, 值2,......, 值n) ,只要遇到非null值就返回。

這樣子就可以設置一個值,讓你第一個不成功後,返回指定的值,如下面,返回的是1.

SELECT COALESCE(MAX(my_money)+1, 1) FROM tb_test;

⑸ 如何把一個文件導入到SQLserver資料庫中

使用場景: 比如將 C:\Test\ 目錄下的所有 txt文件內容 導入到 Table_1 中

--定義臨時表,用於存放獲取的文件名稱
CREATE TABLE #files (name varchar(200) NULL, sql varchar(7000) NULL)
--獲取文件名稱,存放在#files
INSERT #files(name)
exec master..xp_cmdshell 'dir c:\test /b'
--刪除不要的文件名稱
DELETE #files WHERE coalesce(name, '') NOT LIKE 'Code%'

--插入需要 導入文件內容的 命令SQL,需要修改 Table_1(改為導入的Table)和文件路徑

UPDATE #files
SET sql = 'BULK INSERT Table_1 FROM ''' + 'C:\Test\'+name + ''' WITH (' +
'DATAFILETYPE = ''char'', FIELDTERMINATOR = ''\t'', ' +
'ROWTERMINATOR = ''\n'')'

--開始執行導入
DECLARE @sql varchar(8000)

DECLARE cur CURSOR STATIC LOCAL FOR
SELECT sql FROM #files

OPEN cur

WHILE 1 = 1
BEGIN
FETCH cur INTO @sql
IF @@fetch_status <> 0
BREAK

EXEC(@sql)
END

DEALLOCATE cur

主要分為讀取文件夾下所有文件和導入文件內容兩部分
--讀取文件夾下所有文件
declare @files table (ID int IDENTITY, FileName varchar(100))
insert into @files execute xp_cmdshell 'dir c:\test /b'
select 'c:\'+ [FileName] AS FILEPATH INTO #temp from @files
SELECT * FROM #temp
--導入文件內容
BULK INSERT dbo.Table_1
FROM #temp
WITH
(
ROWTERMINATOR ='\n'
)

還需要開啟
/***** Step 1 開啟 xp_cmdshell
Use Master
GO
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO
*******/
參考:
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/47c8edc1-8cad-4a24-a09a-3fc0c943325c/bulk-insert-multiple-files-tsql

⑹ 資料庫查詢 sql select sum()

什麼情況下會返回0:這個很好解釋,以sum(coalesce(case auditing when 1 then 1 end, 0))為例,當查詢結果中所有記錄中的auditing列都不為1時,就會返回0.什麼情況下會返回NULL:不容易解釋的是這個,既然sum函數的參數是經由coalesce函數獲得的,且coalesce函數的參數中又有固定值0,就我目前對該函數的理解,應該是不可能返回NULL的.或許我看到的不是實際上得到你所粘貼的查詢結果的代碼,因為很明顯查詢列的名稱就不一樣,且執行圖片中sql語句,其結果似乎最多隻會有一條記錄.

⑺ SQL語句:COALESCE(t1.CONTENT,'') <>'' 為什麼不等於 t1.CONTENT<>NULL我覺得是一樣的。。。

null 在資料庫中 表示 不可知

你不能 用 = null 、 <> null 等等 進行判斷。

判斷的結果 同樣是: 不可知(不確定)

所以所有的返回結果都是 false

可以 t1.CONTENT is not NULL 、 t1.CONTENT is NULL 進行判斷

⑻ 如何使用Oracle的COALESCE函數

資料庫應用軟體很多時候將多重的、相關的實體信息保存在同一個表格中。例如,購買的零件和本地生產的零件都是零件,經理和工人都是員工,盡管多重的實體類型在數據存儲上略有不同,但是它們有太多的相同之處,因此通常使用一個表格而不是兩個。
處理這樣的表格通常意味著對每一行進行條件測試來檢查哪個實體類型正在被處理,然後返回每種類型的不同結果集。CASE語句可以用來完成這一工作。
從Oracle 9i版開始,COALESCE函數在很多情況下就成為替代CASE語句的一條捷徑,COALESCE的格式如下:
COALESCE (expression_1, expression_2, ...,expression_n)
列表中第一個非空的表達式是函數的返回值,如果所有的表達式都是空值,最終將返回一個空值。
使用COALESCE的秘密在於大部分包含空值的表達式最終將返回空值(連接操作符||是一個值得注意的例外)。例如,空值加任何值都是空值,空值乘任何值也都是空值,依此類推。
這樣您就可以構建一系列表達式,每個表達式的結果是空值或非空,這就像一個CASE語句,表達式按照順序進行測試,第一個滿足條件的值就確定了結果。
列表A展示了名為PARTS的表格的一部分,該表格存儲了購買的零件數據和生產的零件數據,如果是購買的零件,那麼part_type列的值為『P』,如果是本地生產或組裝的則是『B』;此外,對於購買的零件,purchase_cost 列會顯示購買成本,而本地生產的零件則是空值;而且,本地生產的零件還有material_qty和material_cost兩列的信息,對於購買的零件則是空值。
您可以使用一個CASE語句來測試part_type列的值並返回either purchase_cost和material_qty列與material_cost列的乘積;不過COALESCE可以用一行語句解決這個問題:
COALESCE(purchase_cost, material_qty * material_cost)
如果數據行中存儲的是一個購買的零件,那麼purchase_cost就不是空值,將返回purchase_cost的值;然而,對於本地生產的零件,purchase_cost是空值,COALESCE會忽略它,然後將material_qty和material_cost相乘,並將乘積作為結果返回。
SELECT part_id "Part", part_type "Type",
COALESCE(purchase_cost, material_qty * material_cost) "Cost"
FROM parts;
您可以對任何數量的表達式重復使用這個模式,COALESCE是一個非常便捷的方法對統一表格中的多重實體求值。
最後,還要說一點CASE語句的優點,就是CASE是自動進行文檔記錄的,這便於理解和解讀正在發生的事情。

⑼ 由於其數據類型的緣故,不能使用某輸入主機變數sqlstate 07006 sqlerror

以下是對這個錯誤的解釋。SQL0204N""是一個未定義的名稱。解釋:此錯誤由以下之一引起:o未在資料庫中定義由""標識的對象。o在表上未定義由""標識的數據分區。o正在使用某個數據類型。此錯誤可能是由於下列原因而發生的:-如果""是限定名稱,則具有此名稱的數據類型在資料庫中不存在。-如果""是非限定名稱,則用戶的函數路徑不包含期望的數據類型所屬於的模式。-該數據類型在創建時間戳記早於程序包綁定時間的資料庫中不存在(適用於靜態語句)。-如果數據類型在CREATETYPE語句的UNDER子句中,則該類型名可能與正定義的類型相同,這是無效的。o下列其中一項中正在引用某個函數:-DROPFUNCTION語句-COMMENTONFUNCTION語句-CREATEFUNCTION語句的SOURCE子句如果""是限定名稱,則函數不存在。如果""是非限定名稱,則當前函數路徑的任何模式中都不存在此名稱的函數。注意,函數不能以COALESCE、NULLIF或VALUE內置函數作為源函數。o在CREATESECURITYLABELCOMPONENT語句中UNDER子句右邊使用了名為「名稱」的元素,但尚未將該元素定義為ROOT或者在其他某個元素下方(UNDER)。o下列其中一個標量函數指定了「名稱」標識的安全策略,但在資料庫中未定義該安全策略。-SECLABEL-SECLABEL_TO_CHAR-SECLABEL_BY_NAME可為任何類型的資料庫對象生成此返回碼。聯合系統用戶:在資料庫中未定義由""標識的對象,或者""不是DROPNICKNAME語句中的昵稱。某些數據源不向""提供適當的值。在這些情況下,消息標記將具有以下格式:"OBJECT:TABLE/VIEW",指示指定數據源的實際值未知。不能處理該語句。用戶響應:確保在SQL語句中正確指定了對象名(包括任何必需的限定符),並且它存在。如果該名稱表示一個數據分區,則查詢目錄表SYSCAT.DATAPARTITIONS以找到一個表的所有數據分區。對於SOURCE子句中缺少的數據類型或函數,可能是該對象不存在,或該對象處於某模式中,但該模式不在您的函數路徑中。對於CREATESECURITYLABELCOMPONENT語句來說,確保先將每個元素指定為ROOT或者UNDER子句中的子代,然後再在UNDER子句中將其指定為父代元素。對於標量函數SECLABEL、SECLABEL_TO_CHAR或SECLABEL_BY_NAME來說,確保對參數「安全策略名」指定了有效的安全策略。聯合系統用戶:如果該語句是DROPNICKNAME,則確保該對象實際上是一個昵稱。該對象可能不存在於聯合資料庫中或數據源上。驗證聯合資料庫對象(如果有)和數據源對象(如果有)的存在情況。sqlcode:-204sqlstate:42704

⑽ SQL Server 資料庫中欄位內容為NULL的處理辦法

-判斷某些欄位是否為空 --case select case when '欄位名' is null then '\N' else convert(varchar(20),'欄位名') end as 'NewName' select case when null is null then '\N' else convert(varchar(20),null) end as 'NewName' --SQL Server 2005:coalesce select coalesce('字元串類型欄位','\N') as 'NewName' select coalesce(convert(varchar(20),'非字元串類型欄位'),'\N') as 'NewName' select coalesce(convert(varchar(20),null),'\N') as 'NewName' --coalesce,返回其參數中的第一個非空表達式 select Coalesce(null,null,1,2,null)union select Coalesce(null,11,12,13,null)union select Coalesce(111,112,113,114,null)