2009-02-02 12 views
12

Piszę zapytanie SQL w SQL Server, w którym muszę zastąpić wiele wartości ciągu pojedynczą wartością ciągu. Na przykładZamień wiele ciągów w zapytaniu SQL

Product  Quantity 
-------  -------- 
Apple  2 
Orange  3 
Banana  1 
Vegetable 7 
Dairy  6 

staną

Product  Quantity 
-------  -------- 
Fruit  2 
Fruit  3 
Fruit  1 
Vegetable 7 
Dairy  6 

Jedynym sposobem, wiem, jak to zrobić, to użyć zagnieżdżone WYMIENIĆ w klauzuli SELECT.

SELECT 
    REPLACE('Banana', REPLACE('Orange', REPLACE('Banana', Product, 'Fruit'), 
      'Fruit'), 'Fruit') AS Product 
FROM 
    Table 

Czy jest łatwiejszy sposób?

EDYCJA: W kategorii produktu mogą być inne wartości. Zobacz edytowany przykład powyżej.

Odpowiedz

20

BradC ma najlepszą odpowiedź tak daleko, ale w przypadku, gdy z jakiegoś powodu nie może utworzyć dodatkową tabelę chciałem pisać adaptację odpowiedź Kibbee za:

SELECT 
    CASE WHEN Product IN ('Banana', 'Apple', 'Orange') Then 'Fruit' 
    ELSE Product END 
FROM [Table] 
+0

To będzie działać najlepiej dla moich celów, ponieważ baza danych, z której ściągam, jest archiwum. W przeciwnym razie dodawanie kolumny kategorii byłoby drogą do zrobienia. Dzięki! –

+0

Mówi, dodając mały tabelę odnośników, i to całkiem proste, nawet dla archiwum db. –

1

Jeśli nie ma innych produktów niż wymienione można zrobić:

SELECT 'Fruit' AS Product, 
     Quantity 
FROM Table 

Jeśli istnieją inne produkty jus dodać WHERE

WHERE Product IN ('Banana', 'Orange', 'Apple') 
7
Select 
Case Product WHEN 'Banana' Then 'Fruit' 
WHEN 'Apple' Then 'Fruit' 
WHEN 'Orange' Then 'Fruit' 
ELSE Product 
END 
FROM Table 
+0

jest to pomocne. Dzięki. –

11

Dodać nową „kategorię” tabela z listą twoich produktów wraz z "kategorią", do której należą.

Po prostu wykonaj wewnętrzne sprzężenie.

+0

pierwszą rzeczą, o której myślałem. – dotjoe

+2

+1 to jest sposób, aby to zrobić – SQLMenace

+0

To byłoby dobre rozwiązanie, z wyjątkiem tego, że wyciągam z archiwum tylko do odczytu. –

1

Można utworzyć tabelę tymczasową z kolumną kolumny "Produkt" i wstawić wszystkie nazwy produktów, które mają zostać zastąpione.

Następnie wykonaj wewnętrzne sprzężenie względem tabeli docelowej dla aktualizacji.

UPDATE 
    Table 
SET Product = 'Fruit' 
FROM 
    Table t1 INNER JOIN #Table t2 on t1.Product = t2.Product 
0

Pojedyncze cudzysłowy do oddzielania tekstu w SQL:

CASE WHEN ShiptoPlant IN (';','/',' ') Then '' ELSE ShipToPlant END