比對不同位數身份證號的SQL問題

2022-03-19 19:12:36 字數 1255 閱讀 3525

今天碰到的問題,人口庫,與需要比對庫的身份證號碼都存在這樣的問題:

記錄裡面有些記錄身份證號碼15位,有些是18位的。

這給比對帶來了麻煩,最好的辦法就是更新成為統一的,因為15變18可能是人工填寫,容易錯,最好都改成15位的。

我不想通過update統一修改庫里的資料,這是自己給自己找的麻煩,怎麼弄呢。

sql畢竟不是程式語言,所以不能在where子句裡進行——是否15位不是改成15,再判斷——這樣的法子。最後找了乙個折中的辦法。

先比對需要對比庫的表裡15的,再比對它裡面的18位的。人口庫通過in(select case when)的方式統一改成15 位。

select 

*from

(select dbo.[sheet].

*from dbo.[sheet]

where

len(dbo.[sheet].[身份證號碼])

>

15and 

(left(dbo.[sheet].[身份證號碼],6)

+substring(dbo.[sheet].[身份證號碼],9,

9)) 

in(select 

case

when 

len([col007])

>

15then 

(left([col007],6)

+substring([col007],9,

9))else

[col007]

end 

as身份證號碼

from dbo.[

2009-04

-21])

union

select dbo.[sheet].

*from dbo.[sheet]

where

len(dbo.[sheet].[身份證號碼])=15

and 

dbo.[sheet].[身份證號碼]

in(select 

case

when 

len([col007])

>

15then 

(left([col007],6)

+substring([col007],9,

9))else

[col007]

end 

as身份證號碼

from dbo.[

2009-04

-21])

)ast效果還行,就是速度不是很快,2w在30w裡比對,3秒不知道算不算慢。

身份證號的檢測

ddddddyyyymmddxxsp共18位 公民身份號碼是特徵組合碼,由十七位數字本體碼和一位校驗碼組成。排列順序從左至右依次為 六位數字位址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。2 位址碼 表示編碼物件常住戶口所在縣 市 旗 區 的行政區劃 按gb t2260的規定執行。3 出...

身份證號的驗證處理

問題1 如何判斷身份證號 正規表示式為 d d d d x x layui框架的表單驗證,框內需要保持一致。問題2 輸入的身份證號如果有x,輸入小寫,自動轉為大寫 css有乙個屬性text transform 給input繫結乙個class,新增樣式 輸入小寫x,自動轉為大寫,效果如圖 問題3 登陸...

15位身份證號的校驗

驗證15位身份證的合法性,該方法驗證不準確,最好是將15轉為18位後再判斷,該類中已提供。param idcard return public boolean isvalidate15idcard string idcard 是否全都為數字 if isdigital idcard if flag 該...