Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Trả về các hàng có ID nằm trong chuỗi được phân tách bằng dấu chấm phẩy từ truy vấn con MSSQL

Đâ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 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi không thành công khi chuyển đổi giá trị varchar 'giá trị trả về của tôi' thành kiểu dữ liệu int

  2. Lỗi phiên bản SQL Server khi đính kèm tệp mdf

  3. Chèn một chuỗi với các số 0 ở đầu để nó dài 3 ký tự trong SQL Server 2008

  4. Xoay vòng bằng SQL Server 2000

  5. Giới thiệu tính năng mới - Phân tích bế tắc