首先推薦一下深入詳解sql中的null( 這篇文章寫得比較全面了。
這裡我說一下我遇到的問題。
在設計乙個儲存過程時,我們經常把乙個變數查詢出來之後,放入乙個變數中。
標準做法是,先select 資料賦值給變數。然後再判斷變數是否為空。(如果事情到這裡,沒有問題了。)
當時為了偷懶直接使用了一些函式來處理null。eg:isnull之類的函式。測試過程中發現沒有解決問題。
於是我開始了查詢問題,先懷疑資料庫,再懷疑介面等等等。
結果我在反覆調查求證之後,發現由於where條件是false。所以沒有結果。進而我在select部分中加的所有函式都無效了。
這就是【結果是空集】與【集合中有乙個物件,物件為空集】經典的集合問題了
樣例表:
-- ----------------------------
-- table structure for `test`
-- ----------------------------
drop table if exists `test`;
create table `test` (
`test_i` int(11) default null,
`test_c` varchar(512) default null
) engine=innodb default charset=gbk;
樣例資料:
-- ----------------------------
-- records of test
-- ----------------------------
insert into `test` values ('1', 'a');
insert into `test` values ('2', 'b');
樣例儲存過程(版本1):
drop procedure if exists `procedure_test`;
create procedure `procedure_test`(
_test_i int(11) ,
_test_c varchar(512)
)begin
declare _test_i_ex int;
select test_i into _test_i_ex from test where test_i = _test_i ;
if _test_i <> _test_i_ex then
insert into test(
test_i,
test_c
)values(
_test_i,
_test_c
);end if ;
end;
我立刻判斷出來_test_i_ex是null引發的問題。於是寫了第二個版本的儲存過程。
樣例儲存過程(版本2改進版):
drop procedure if exists `procedure_test`;
create procedure `procedure_test`(
_test_i int(11) ,
_test_c varchar(512)
)begin
declare _test_i_ex int;
select nullif(test_i,1) into _test_i_ex from test where test_i = _test_i ; /*用函式判斷了,當這個值為null的時候*/
if _test_i <> _test_i_ex then
insert into test(
test_i,
test_c
)values(
_test_i,
_test_c
);end if ;
end;
第二次的修改,雖然問題點是正確的,但是改法不足。
因為查詢結果為空,所以函式判斷根本沒用。
當sql語句中 遇到null發生的故事
今天測試過程發現個問題,sql語句中 不起作用,原sql語句如下 執行結果是0列 select from company member rel where companyid 111552 and active n 資料庫中,表company member rel部分資料如下 如果companyid...
sql語句中null和空字元的區別
例子 value nullif x,y value是函式 1 null 代表宣告了乙個空物件,而不僅僅是乙個字串,值可以賦給任何物件。空字元 代表宣告了乙個物件例項,這個物件例項的值是乙個長度為0的空字串。2 string s null 只是定義了乙個控制代碼,即你有了個引用,但是這個引用未指向任何...
在 SQL 語句中處理 NULL 值的方法
在日常使用資料庫時,你在意過null值麼?其實,null值在資料庫中是乙個很特殊且有趣的存在,下面我們一起來看看吧 在查詢資料庫時,如果你想知道乙個列 例如 使用者註冊年限 user age 是否為 null,sql 查詢語句該怎麼寫呢?是這樣 select from table where use...