Đây là một ví dụ khác về tầm quan trọng của việc chuẩn hóa dữ liệu của bạn.
Giữ nhiều điểm dữ liệu trong một cột gần như không bao giờ là thiết kế chính xác và gần như không bao giờ ý tôi là khoảng 99,9999%.
Nếu bạn không thể chuẩn hóa cơ sở dữ liệu của mình, bạn có thể sử dụng một giải pháp khác như sau:
SELECT *
FROM Projects p
WHERE EXISTS (
SELECT Project_ID
FROM Feedback F WHERE ID = 268
AND Project_ID IS NOT NULL
AND ';'+ F.Project_ID +';' LIKE '%;'+ CAST(p.Project_ID as varchar) +';%'
)
Bạn không thể sử dụng IN
vì nó mong đợi một danh sách các giá trị được phân tách bằng dấu phẩy, trong khi bạn cố gắng cung cấp cho nó một giá trị duy nhất được phân tách bằng dấu chấm phẩy. Ngay cả khi các giá trị trong Project_ID được phân tách bằng dấu phẩy thì nó vẫn không hoạt động.
Lý do tôi thêm ;
ở mỗi bên của Project_ID
trong cả hai bảng theo cách này là LIKE
toán tử sẽ trả về true
đối với bất kỳ vị trí nào, nó sẽ tìm thấy Projects.Project_Id
bên trong Feedback.Project_Id
. Bạn phải thêm ;
vào Projects.Project_Id
để ngăn chặn LIKE
để trả về true
khi bạn đang tìm kiếm một số khớp một phần với các số trong chuỗi phân tách. Hãy xem xét tìm kiếm 12 trong một chuỗi chứa 1; 112; 455 - mà không thêm dấu phân tách vào giá trị tìm kiếm (12 trong ví dụ này) LIKE
toán tử sẽ trả về true
.