PDA

View Full Version : Giúp mình SQL điều kiện Check sdt



dangtungX
08-12-2010, 08:28
E có đề bài SQL sau: Các A ktra cho em xem làm thế đã đúng hết chưa. Riêng ý cuối cùng check số điện thoại em ko být. Ai sửa cho em với. Thanks

Tạo CSDL là TenHocSinh bao gồm các bảng sau:
KhachHang(#MaKH, TenCT, TenGiaoDich, DiaChi, DienThoai)
NhanVien(#MaNV, HoTen, NgaySinh, GioiTinh, DiaChi, LuongCoBan)
DonDatHang(#SoHD, @MaKH, @MaNV, NgayDatHang, NgayGiaoHang)

Câu lệnh sql:

- Tạo rằng buộc khóa chính, khóa phụ như trên
- Tạo rằng buộc defaul cho trường giới tính của bảng NhanVien là NAM
- Tạo rằng buộc unique cho trường TenGiaoDich của bảng KhachHang
- Tạo ràng buộc check nhằm quy định số điện thoại của khách hàng từ 6 ~> 11 chữ số
- Nhập dữ liệu cho các bảng (5 bản ghi/1 bảng)

@: Khoa phu
#: Khoa Chinh


create database TenHocSinh
use TenHocSinh

create table KhachHang(
MaKH char(5) primary key,
TenCT nvarchar(50),
TenGiaoDich nvarchar(50) unique,
DiaChi nvarchar(200),
DienThoai int
)

create table NhanVien(
MaNV char(5) primary key,
HoTen nvarchar(50),
NgaySinh datetime,
GioiTinh bit default'NAM',
DiaChi nvarchar(200),
LuongCoBan float
)

create table DonDatHang(
SoHD char(5) primary key,
MaKH char(5),
MaNV char(5),
NgayDatHang datetime,
NgayGiaoHang datetime,
constraint Rb_MaKH foreign key(MaKH) references KhachHang(MaKH),
constraint Rb_MaNV foreign key(MaNV) references NhanVien(MaNV)
)

[=========> Bổ sung bài viết <=========]

uppppppppppppppppppppppppppppp

Red Devilic
09-12-2010, 19:27
Check số điện thoại thì chỉ cần kiểm tra LENGTH(SODIENTHOAI) BETWEEN 6 AND 11 là được rồi

Để kiểu Int cho số điện thoại cũng được, nhưng sẽ không lưu được số 0 ở đầu.

Tôi không nhớ là kiểu Int miền giá trị chính xác là bao nhiêu nhưng hình như từ âm 2 tỷ cho đến khoảng 2 tỷ

Để chắc ăn thì nên để kiểu chuỗi varchar.

khoathi
09-12-2010, 21:23
Mình nên để số điện thoại là kiểu chuỗi, đừng nên để kiểu int. Nếu để kiểu int mà lưu số điện thoại coi chừng nguy hiểm. Kiểm tra chiều dài chuỗi thì bạn cứ dùng
LEN(SODIENTHOAI) BETWEEN 6 AND 11

zxcongducxz
20-12-2010, 08:25
create database TenHocSinh
go
use TenHocSinh
go
create function funcSDT
(
@SoDT nvarchar(Max)
)
returns bit
as
begin
Declare @KQ bit;
Set @KQ=0;
Declare @So tinyint;
Set @So=0;
Declare @i tinyint;
Set @i=0;
While (@i<=len(@SoDT))
begin
if (charindex(substring(@SoDT,@i,1),'0123456789')!=0)
Set @So=@So+1;
Set @i=@i+1;
end
if (@SoDT='' or @So=10 or @So=11)--Điều kiện kiểm tra số đt ở đây
Set @KQ=1;
return @KQ;
end
go
create table KhachHang(
MaKH char(5) primary key,
TenCT nvarchar(50),
TenGiaoDich nvarchar(50) unique,
DiaChi nvarchar(200),
DienThoai char(15) check (dbo.funcSDT(DienThoai)=1)
)

create table NhanVien(
MaNV char(5) primary key,
HoTen nvarchar(50),
NgaySinh smalldatetime,
GioiTinh bit default 1,
DiaChi nvarchar(200),
LuongCoBan float
)

create table DonDatHang(
SoHD char(5) primary key,
MaKH char(5) foreign key references KhachHang,
MaNV char(5) foreign key references NhanVien,
NgayDatHang smalldatetime,
NgayGiaoHang smalldatetime,
)
--Cố gắng biến SQL thành ngôn ngữ lập trình =.+'

Red Devilic
20-12-2010, 08:45
Bạn quá lạm dụng và hướng các câu lệnh SQL đến gần với lập trình.
Không phải cái gì trong SQL đưa lên để giải quyết theo hướng lập trình cũng là cách tốt nhất.

Để kiểm tra SDT như bạn trình bày là NVARCHAR(MAX) đã thấy rất nhiều vấn đề

- Không ai để số điện thoại là kiểu NVARCHAR, vì SDT bản thân nó cũng không cần Unicode

- Không cần phải max, số điện thoại có lưu được đến 2Gb không ?

- Thay vì chạy để kiểm tra từng kí tự 1 có phải là 1,2,3....9,0 hay không, bạn có thể dùng luôn ISNUMERIC.

zxcongducxz
20-12-2010, 23:31
chơi nvarchar(Max) cho khỏe, bất cứ tham số truyền vào nào cũng đúng. Nếu hok thích thì sửa lại thành char(15).
Còn kiểu số điện thoại mình hok để isnumeric :
+Đếm đc số lượng số nhập vào mà isnumeric không làm đc.
+Nhận số DD số đẹp: 0932 04 03 92 (số ngày sinh :D)
+Nhận số ĐT bàn: (083) 1234566 (VD)
+Hiểu rằng
0932 04 03 92
0932.04.03.92
0932-04-03-92
....
như nhau

Red Devilic
21-12-2010, 08:19
Tôi cho rằng bạn trước sau không thống nhất

Bài trước thì kiểm tra từng kí tự, xem có phải là chữ số hay không.

Nhưng sau khi nhận được góp ý thì lại đưa 1 ví dụ không ăn nhập gì với bài trứoc của bạn là đưa các kí tự lạ ( khoảng trắng, gạch ngang, ... )để lấy dẫn chứng cho việc số đẹp ?

Vậy với dữ liệu như thế, nếu tôi điền linh tinh bao gồm cả chữ và số,kí tự lạ kiểu như *&^%@#@#66935792sdgbvsb24, vẫn đảm bảo là có 10 hoặc 11 chữ số thì đoạn check của bạn vẫn ra kết quả đây là 1 số điện thoai chứ :)

Bạn thực sự vẫn chưa phải là một người làm việc chuyên với CSDL, mà mới là 1 người mới chuyển từ việc lập trình sang CSDL thôi. :)

zxcongducxz
21-12-2010, 10:31
Hôi mệt ghê, đứa nào nhập khác thì đuổi việc nó luôn y :))

vuht2000
21-12-2010, 21:07
làm gì mà dữ thế, kỷ luật quân đội như viettel chắc cũng không đến như vậy ;) Tôi thấy vấn đề đơn giản thôi, giả sử ngoài chữ sổ chỉ cho phép một vài ký tự khác như (,),- và dấu cách ' '; thì chỉ việc dùng hàm REPLACE thay mấy ký tự đó thành dấu trắng:
SET @std_new = REPALCE(REPLACE(@std,'(',''),')','') ...

rồi dùng hàm ISNUMERIC kiểm tra xem @sdt_new có phải là số không là xong

zxcongducxz
21-12-2010, 22:43
Trong quá trình tạo bảng làm sao replace chuỗi nhập vào đc bạn, chỉ kiểm tra đc thôi.
Nếu vậy chắc sài trigger, không thì sài chương trình cho nó kiểm tra xong rồi chương trình gửi lên SQL =]]

vuht2000
22-12-2010, 10:38
à tôi ví dụ thế. Muốn kiểm tra ngay tham số đầu vào thì chỉ cần viết:
IF ISNUMERIC(REPALCE(REPLACE(@std,'(',''),')','') ...)=1
RETURN 1
ELSE RETURN 0