Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Porównaj zmienną varchar z inną zmienną varchar

1) W perspektywie średnio- lub długoterminowej chciałbym znormalizować tę bazę danych, aby uniknąć takich błędów:przechowywanie listy wartości w kolumnach string/VARCHAR. Na przykład użyłbym następującej tabeli od wielu do wielu:

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
);

W tym przypadku jeden rachunek z dwoma pozycjami oznacza, że ​​muszę wstawić dwa wiersze do dbo.BillItem tabeli.

2) Wracając do pierwotnej prośby:do jednorazowego zadania użyłbym więc XML i XQuery (to rozwiązanie kończy się instrukcją SELECT, ale proste jest przekonwertowanie na UPDATE):

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

Wyniki:

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. Czy możemy zainstalować edycję Express i edycję Standard SQL Server na tym samym komputerze użytkownika?

  2. Serwer Xampp MS SQL PHP 5.6

  3. Dlaczego (i jak) podzielić kolumnę za pomocą master..spt_values?

  4. Zapytanie SQL, aby znaleźć ostatni dzień bieżącego miesiąca?

  5. Bardzo skomplikowany problem z zapytaniem SQL