Mam zapytanie Transact-SQL, które używa operatora IN. Coś takiego:
select * from myTable where myColumn in (1,2,3,4)
Czy istnieje sposób na zdefiniowanie zmiennej do przechowywania całej listy „(1,2,3,4)”? Jak mam to zdefiniować?
declare @myList {data type}
set @myList = (1,2,3,4)
select * from myTable where myColumn in @myList
Odpowiedzi:
źródło
źródło
[Err] 42000 - [SQL Server]Must declare the scalar variable "@mylist".
(VALUES (1),(2),(3),(4),(5))
bezpośrednio?Istnieją dwa sposoby radzenia sobie z dynamicznymi listami csv dla zapytań TSQL:
1) Korzystanie z wewnętrznego wyboru
2) Korzystanie z dynamicznie konkatenowanego języka TSQL
3) Trzecią możliwą opcją są zmienne tabelaryczne. Jeśli masz SQl Server 2005, możesz użyć zmiennej tabeli. Jeśli korzystasz z Sql Server 2008, możesz nawet przekazać zmienne całej tabeli jako parametr do procedur składowanych i użyć ich w złączeniu lub jako podselekcji w klauzuli IN.
źródło
Użyj takiej funkcji:
Zamiast używać like, tworzysz sprzężenie wewnętrzne z tabelą zwracaną przez funkcję:
staje się
W niezindeksowanej tabeli rekordów 1M druga wersja zajęła mniej więcej połowę czasu ...
Twoje zdrowie
źródło
Należy pamiętać, że w przypadku długich list lub systemów produkcyjnych nie zaleca się używania tego sposobu, ponieważ może być znacznie wolniejszy niż prosty
IN
operatorsomeColumnName in (1,2,3,4)
(testowany przy użyciu listy 8000+ pozycji)źródło
Nie, nie ma takiego typu. Ale jest kilka możliwości:
Żaden z nich nie jest naprawdę elegancki, ale to najlepsze, jakie istnieje.
źródło
niewielka poprawa w stosunku do @LukeH, nie ma potrzeby powtarzania "INSERT INTO": i odpowiedzi @ realPT - nie ma potrzeby posiadania SELECT:
źródło
Wiem, że to jest teraz stare, ale TSQL => 2016, możesz użyć STRING_SPLIT:
źródło
Począwszy od SQL2017 możesz użyć STRING_SPLIT i zrobić to:
źródło
Jeśli chcesz to zrobić bez użycia drugiej tabeli, możesz wykonać LIKE porównanie z CAST:
Jeśli pole, które porównujesz, jest już ciągiem znaków, nie musisz wykonywać RZUTU.
Ujęcie zarówno dopasowania kolumny, jak i każdej unikalnej wartości przecinkami zapewni dokładne dopasowanie. W przeciwnym razie wartość 1 zostałaby znaleziona na liście zawierającej „, 4,2,15,”
źródło
Jak nikt wcześniej o tym nie wspominał, począwszy od Sql Server 2016 można również używać tablic json i
OPENJSON (Transact-SQL)
:Możesz to przetestować w sql fiddle demo
Możesz również łatwiej opisać bardziej skomplikowane przypadki za pomocą json - zobacz Przeszukiwanie listy wartości i zakresu w SQL za pomocą klauzuli WHERE IN ze zmienną SQL?
źródło
Ten używa PATINDEX do dopasowania identyfikatorów z tabeli do niecyfrowej listy liczb całkowitych.
Uwagi:
źródło
źródło
Myślę, że będziesz musiał zadeklarować ciąg, a następnie wykonać ten ciąg SQL.
Spójrz na sp_executeSQL
źródło