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

Lệnh T-SQL Stuff

Ý tưởng chính xung quanh chức năng SQL Server được gọi là STUFF là nối nhiều cột thành một cột duy nhất với tính linh hoạt hơn so với hàm CONCAT sẽ cung cấp. Ngoài ra, STUFF có thể được kết hợp với các kỹ thuật khác để tạo ra một số hiệu ứng thú vị.

Trong bài viết này, chúng ta sẽ khám phá các khả năng mà lệnh STUFF cung cấp cho các chuyên gia Cơ sở dữ liệu SQL.

Hàm T-SQL STUFF

Đầu tiên chúng ta hãy xem định nghĩa chính thức của Microsoft về hàm STUFF:

Hàm STUFF chèn một chuỗi vào một chuỗi khác. Nó xóa một độ dài được chỉ định của các ký tự trong chuỗi đầu tiên ở vị trí bắt đầu và sau đó chèn chuỗi thứ hai vào chuỗi đầu tiên ở vị trí bắt đầu.

Do đó, khi bạn đang sử dụng lệnh STUFF, bạn đang sắp xếp lại dữ liệu cột.

Hãy xem một vài ví dụ.

Đầu tiên là đầu ra từ lệnh STUFF - chuỗi ABCDEFG ban đầu sẽ được nhồi với chuỗi XXX.

SELECT STUFF('ABCDEFG',3,3,'XXX');

Chúng tôi sẽ phân tích kết quả này để hiểu đầy đủ về lệnh STUFF:

Bây giờ, tham số thứ ba được tăng lên các giá trị 4,5,6.

SELECT STUFF('ABCDEFG',3,4,'XXX');
SELECT STUFF('ABCDEFG',3,5,'XXX');
SELECT STUFF('ABCDEFG',3,6,'XXX');

Giải thích cuộc gọi hàm

Việc thay thế xảy ra ở ký tự thứ ba của chuỗi ABCDEFG ban đầu trong mỗi lần thực thi. Sự khác biệt duy nhất là số ký tự được chỉ định để xóa thông qua tham số độ dài xóa .

Do đó, khi độ dài xóa tham số từ vị trí bắt đầu tham số dài hơn chuỗi ban đầu, dữ liệu bị cắt ngắn.

Ví dụ:chuỗi ban đầu của chúng tôi dài 7 ký tự. Hàm STUFF bắt đầu ở vị trí 3 và chạy thêm 5 ký tự. Vì 8 nhiều hơn độ dài chuỗi ban đầu là 7 nên giá trị được trả về là ABXXX.

Sử dụng nhiều STUFF trong cùng một truy vấn

Bạn có thể lồng lệnh STUFF bên trong một lệnh STUFF khác và sử dụng nó nhiều lần nếu cần. Tuy nhiên, bạn nên xem xét nó ảnh hưởng như thế nào đến các truy vấn mức sản xuất. Mỗi lệnh gọi lồng nhau đang chạy cho mọi hàng dữ liệu được trả về.

SELECT STUFF(STUFF('ABCDEFG',1,1,'1'),7,1,'7') as StuffExample5;

Trong ví dụ này, ký tự đầu tiên của chuỗi ban đầu được thay thế bằng ký tự 1 và ký tự cuối cùng được thay thế bằng ký tự 7.

STUFF và ForXML

ForXML là một tính năng trong SQL Server có thể chuyển đổi tập hợp kết quả của các truy vấn SQL thành kết quả có định dạng XML.

STUFF cũng có thể được kết hợp với các chức năng SQL Server khác như ForXML. Nó giúp hợp nhất dữ liệu cho các mục đích báo cáo. Hãy xem cấu trúc bảng sau:

Giả sử bạn muốn một báo cáo có 2 cột. Cột đầu tiên là USER_NAME và thứ hai là vai trò được phân tách bằng dấu phẩy cho mỗi vai trò mà người dùng nắm giữ. Làm thế nào điều này có thể được thực hiện trong T-SQL thuần túy?

Xây dựng cấu trúc bảng và chèn dữ liệu:

CREATE TABLE 
#USER
(
USER_ID INT,
USER_NAME VARCHAR(50)
)

CREATE TABLE
#USER_ROLES
(
USER_ID INT,
ROLE VARCHAR(50)
)


INSERT INTO #USER VALUES(1,'Edward')
INSERT INTO #USER VALUES(2,'John')
INSERT INTO #USER VALUES(3,'Mark')

INSERT INTO #USER_ROLES VALUES(1,'Admin')
INSERT INTO #USER_ROLES VALUES(1,'Writer')
INSERT INTO #USER_ROLES VALUES(1,'Form')
INSERT INTO #USER_ROLES VALUES(2,'Writer')
INSERT INTO #USER_ROLES VALUES(3,'Form')
INSERT INTO #USER_ROLES VALUES(3,'Writer');

Sử dụng lệnh STUFF:

SELECT 
   U.USER_NAME,
   STUFF((SELECT ',' + UR.ROLE 
          FROM #USER_ROLES UR
          WHERE UR.USER_ID = U.USER_ID
          FOR XML PATH('')), 1, 1, '') [ROLES]
FROM #USER U
GROUP BY U.USER_NAME, U.USER_ID
ORDER BY 1

Trong ví dụ này, một truy vấn bên trong được kết hợp với mỗi USER_ID. Lệnh STUFF dùng để thay thế dấu phẩy ban đầu. Kết quả là chúng tôi có một danh sách đẹp được phân tách bằng dấu phẩy của từng người dùng với các vai trò tương ứng.

Các trường hợp sử dụng

Mặt nạ dữ liệu

SQL Server cung cấp các giải pháp cho việc tạo mặt nạ dữ liệu động. Tuy nhiên, STUFF có thể được sử dụng để làm xáo trộn dữ liệu nhạy cảm khi nó được hiển thị. Hãy tưởng tượng một khung cảnh nằm trên đầu một bảng có các trường PII của khách hàng chẳng hạn như SSN. Chế độ xem có thể sử dụng lệnh STUFF để che mọi thứ ngoại trừ 4 chữ số cuối cùng của SSN.

Hợp nhất dữ liệu

Như đã trình bày với FORXML và STUFF, T-SQL cung cấp khả năng hợp nhất dữ liệu thành các cột đơn với một số loại định danh chính. Trong ví dụ này, đó là USER_NAME. Tuy nhiên, kiểu phân tích này khá phổ biến trong kiến ​​trúc báo cáo cơ sở dữ liệu.

Tóm tắt

Như vậy, chúng ta đã trình bày các tham số của lệnh STUFF trong T-SQL và hiểu cách so sánh lệnh này với CONCAT. Chúng tôi đã trình bày các ví dụ đơn giản và phức tạp về lệnh STUFF và liệt kê một số trường hợp sử dụng mà STUFF có thể áp dụng được.

Đó là một mệnh lệnh có giá trị và có thể là một công cụ tuyệt vời để bạn có dưới dây đai của mình. Vui lòng nhận xét với các trường hợp sử dụng khác cho lệnh STUFF.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đo hiệu suất cơ sở dữ liệu dưới áp suất

  2. Flask theo ví dụ - Thiết lập Postgres, SQLAlchemy và Alembic

  3. Cách phân loại, tìm và che giấu PII trong cơ sở dữ liệu…

  4. Ghi nhật ký tối thiểu với CHÈN… CHỌN vào các bảng được phân nhóm trống

  5. Bảo mật các Nhóm Mongo của bạn bằng SSL