Porównanie napisów z zapytaniach SQL

0
use Northwind
select C1.CompanyName, C2.CompanyName from [Order Details]
inner join Orders on Orders.OrderID = [Order Details].Orderid
inner join Customers as C1 on C1.CustomerID = Orders.CustomerID
inner join Customers as C2 on C1.CustomerID = C2. Customerid
where C1.CustomerID > C2.customerid

Niestety to nie działa, bo CutomerID to napisy. Jak można zamienić znak > aby działało?

0

CAST(zmienna AS INTEGER)

0

Conversion failed when converting the nvarchar value 'ALFKI' to data type int.

chodzi o to, że te ID, to są typu ALFKI itd, to nie są liczby zapisane jako napisy, tylko po prostu napisy...

0

Zaraz, zaraz przecież MSSQL bez problemu porównuje napisy, nawet bez konieczności konwersji/casta.

Porównuje kolejne litery ciągów, przy czym uwzględnia tylko fragment o długości najkrótszego porównywanego ciągu czyli 'aaaz' jest zawsze mniejsze od 'abc' (tak naprawdę w tym wypadku porównywane są ciągi 'aaa' (fragment o długości najkrótszego ciągu) z 'abc').

0

To dlaczego leci SYNTAX ERROR ?

0

Z Books Online:

Comparison operators test whether two expressions are the same. Comparison operators can be used on all expressions except expressions of the text, ntext, or image data types. The following table lists the Transact-SQL comparison operators.

Co do syntax error to może być ono spowodowane np. porównywaniem stringa z integerem itd. Ciężko cokolwiek powiedzieć bez znajomości szczegółów.

0

Dziś postawiłem na swoim lokalnym serwerze bazę Northwind i z ciekawości sprawdziłem Twoje zapytanie. Zapytanie wykonało się bez błędu i zwróciło 0 rekordów. Zwróciło 0 rekordów dlatego, że najpierw w tym miejscu "inner join Customers as C2 on C1.CustomerID = C2. CustomerID" zażyczyłeś sobie otrzymanie listy klientów z takim samym CustomerID w C1 i C2, a następnie w where umieściłeś warunek "where C1.CustomerID <> C2.customerid", który wyklucza ten poprzedni.

Zmodyfikowałem Twoje zapytanie

select C1.CustomerID, C2.customerid from [Order Details]
inner join Orders on Orders.OrderID = [Order Details].Orderid
inner join Customers as C1 on C1.CustomerID = Orders.CustomerID
inner join Customers as C2 on C1.CustomerID <> C2. Customerid
where C1.CustomerID > C2.customerid

i teraz również wykonuje się bez błędu oraz zwraca 99703 rekordy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1