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

SQL So sánh biến varchar với một biến varchar khác

1) Về trung hạn hoặc dài hạn, tôi muốn chuẩn hóa cơ sở dữ liệu này để tránh những sai lầm như:lưu trữ danh sách các giá trị trong các cột chuỗi / VARCHAR. Ví dụ, tôi sẽ sử dụng bảng sau many to many:

CREATE TABLE dbo.BillItem (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    BilldID INT NOT NOT NULL REFERENCES dbo.Bill(BilldID),
    ItemID INT NOT NULL REFERENCES dbo.Item(ItemID),
    UNIQUE (BillID, ItemID) -- Unique constraint created in order to prevent duplicated rows
);

Trong trường hợp này, một hóa đơn có hai mặt hàng có nghĩa là tôi phải chèn hai hàng vào dbo.BillItem bảng.

2) Quay lại yêu cầu ban đầu:đối với tác vụ một lần, tôi sẽ sử dụng XML và XQuery do đó (giải pháp này kết thúc bằng một câu lệnh SELECT nhưng việc chuyển đổi thành UPDATE là rất nhỏ):

DECLARE @iCountRef VARCHAR(100) = '1,2,3'

DECLARE @SourceTable TABLE (
    BillId          INT,
    LineReference   VARCHAR(8000)
)

INSERT @SourceTable (BillId, LineReference)
VALUES
(100, '1,2,'),
(100, '1,2,40,34'),
(100, '1'),
(100, '12')

DECLARE @iCountRefAsXML XML = CONVERT(XML, '<a><b>' + REPLACE(@iCountRef, ',', '</b><b>') + '</b></a>')

SELECT  *, STUFF(z.LineReferenceAsXML.query('
    for $i in (x/y)
        for $j in (a/b)
            where data(($i/text())[1]) eq data(($j/text())[1])
        return concat(",", ($i/text())[1])
').value('.', 'VARCHAR(8000)'), 1, 1, '') AS NewLineReference
FROM (
    SELECT  *, CONVERT(XML, 
        '<x><y>' + REPLACE(LineReference, ',', '</y><y>') + '</y></x>' + 
        '<a><b>' + REPLACE(@iCountRef, ',', '</b><b>') + '</b></a>'
    ) AS LineReferenceAsXML
    FROM    @SourceTable s
) z

Kết quả:

BillId      LineReference  NewLineReference LineReferenceAsXML                                                      
----------- -------------  ---------------- ------------------------------------------------------------------------
100         1,2,           1 ,2             <x><y>1</y><y>2</y><y /></x><a><b>1</b><b>2</b><b>3</b></a>             
100         1,2,40,34      1 ,2             <x><y>1</y><y>2</y><y>40</y><y>34</y></x><a><b>1</b><b>2</b><b>3</b></a>
100         1              1                <x><y>1</y></x><a><b>1</b><b>2</b><b>3</b></a>                          
100         12             (null)           <x><y>12</y></x><a><b>1</b><b>2</b><b>3</b></a>                         


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL So sánh Tổng số đơn đặt hàng hàng giờ và loại bỏ hàng tồn kho hiện tại có thể xảy ra?

  2. Thêm một cột được tính toán vào một bảng hiện có trong SQL Server

  3. so sánh các giá trị được phân tách bằng dấu phẩy trong sql

  4. Nhập CSV trong SQL Server 2008

  5. FLOOR () Ví dụ trong SQL Server