更新: 有人将此问题标记为“如何分割字符串,以便我可以访问项目x”的重复项。但这是不同的,我的问题是关于Sybase SQL Anywhere,另一个是关于MS SQLServer。这是两个不同的SQL引擎,即使它们具有相同的来源,也具有不同的语法。因此它不是重复的。我首先在描述和标记中写了所有关于 SybaseSQL Anywhere的内容 。
我有田野 id_list='1234,23,56,576,1231,567,122,87876,57553,1216'
id_list='1234,23,56,576,1231,567,122,87876,57553,1216'
我想用它来搜索IN该字段:
IN
SELECT * FROM table1 WHERE id IN (id_list)
id 是 integer
id
integer
id_list 是 varchar/text
id_list
varchar/text
但是以这种方式行不通,因此我需要以某种方式拆分id_list为选择查询。
我应该在这里使用什么解决方案?我正在使用T-SQL Sybase ASA 9数据库(SQL Anywhere)。
我看到的方式是,通过while循环创建自己的函数,并基于定界符位置搜索拆分每个元素,然后将元素插入到临时表中,该函数将作为结果返回。
就像 Mikael Eriksson 所说的那样, dba.stackexchange.com上 有两个非常好的解决方案,一个是使用sa_split_list系统过程的解决方案,第二是使用CAST语句的解决方案。
sa_split_list
CAST
由于sa_split_list不存在Sybase SQL Anywhere 9系统过程,因此我进行了sa_split_list系统过程替换(我使用了来自 bsivel 答案的部分代码):
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
执行sa_split_list与默认分隔符相同的方法,:
,
select * from str_split_list(‘1234,23,56,576,1231,567,122,87876,57553,1216’)
select * from
str_split_list(‘1234,23,56,576,1231,567,122,87876,57553,1216’)
或使用可以更改的指定定界符:
select * from str_split_list(‘1234,23,56,576,1231,567,122,87876,57553,1216’, ‘,’)
str_split_list(‘1234,23,56,576,1231,567,122,87876,57553,1216’, ‘,’)