Champ de chaîne divisé / explosage de virgule en requête SQL
-
01-11-2019 - |
Question
J'ai un champ id_list='1234,23,56,576,1231,567,122,87876,57553,1216'
Et je veux l'utiliser pour rechercher IN
Ce champ:
SELECT *
FROM table1
WHERE id IN (id_list)
id
estinteger
id_list
estvarchar/text
Mais de cette façon, cela ne fonctionne pas, donc j'ai besoin d'une certaine manière de se séparer id_list
dans SELECT QUERY.
Quelle solution dois-je utiliser ici? J'utilise la base de données T-SQL Sybase ASA 9 (SQL Anywhere). Mais de cette façon, cela ne fonctionne pas, donc j'ai besoin d'une certaine manière de se séparer id_list
dans SELECT QUERY.
La façon dont je vois cela, consiste à créer sa propre fonction avec une boucle à travers, et chaque élément extrait basé sur la recherche de position divisée par délimiteur, puis insérez des éléments dans la table temporaire quelle fonction reviendra en conséquence.
Commentaires à Sebastian Meine Réponse et ses solutions:
Sybase SQL n'importe où 9
sa_split_list
La procédure du système n'existe pas ici, donc cela ne fonctionne pas
CAST
fonctionne très bienSybase SQL n'importe où 12
sa_split_list
La procédure du système existe et fonctionne très bien
CAST
fonctionne très bienPour le Sybase SQL n'importe où 9, j'ai fait du remplacement de la procédure du système SA_SPLIT_LIST:
CREATE PROCEDURE str_split_list(in str long varchar, in delim char(10) default ',') RESULT( line_num integer, row_value long varchar) BEGIN DECLARE str2 long varchar; DECLARE position integer; CREATE TABLE #str_split_list ( line_num integer DEFAULT AUTOINCREMENT, row_value long varchar null, primary key(line_num)); SET str = TRIM(str)+delim; SET position = CHARINDEX(delim, str); separaterows: WHILE position > 0 loop SET str2 = TRIM(LEFT(str, position - 1)); INSERT INTO #str_split_list (row_value) VALUES (str2); SET str = RIGHT(str, LENGTH(str) - position); SET position = CHARINDEX(delim, str); end loop separaterows; select * from #str_split_list order by line_num asc; END
Exécutez la même manière que SA_SPLIT_LIST:
select * from str_split_list('1234,23,56,576,1231,567,122,87876,57553,1216')
Pas de solution correcte