使用Sybase SQL Anywhere分割/分解逗号分隔的字符串

Blu*_*ark 2 sql t-sql sybase split sqlanywhere

更新: 有人将此问题标记为“我如何分割字符串,以便可以访问项目x”的重复 。但这是不同的,我的问题是关于Sybase SQL Anywhere,另一个是关于MS SQL Server。这是两个不同的SQL引擎,即使它们具有相同的来源,也具有不同的语法。因此它不是重复的。我首先在描述和标签中写到了关于Sybase SQL Anywhere的全部内容。

我有田野 id_list='1234,23,56,576,1231,567,122,87876,57553,1216'

我想用它来搜索IN该字段:

SELECT * 
FROM table1
WHERE id IN (id_list)
Run Code Online (Sandbox Code Playgroud)
  • idinteger

  • id_listvarchar/text

但是以这种方式行不通,因此我需要以某种方式拆分id_list为选择查询。

我应该在这里使用什么解决方案?我正在使用T-SQL Sybase ASA 9数据库(SQL Anywhere)。

我看到的方式是,通过while循环创建自己的函数,并基于分隔符位置搜索拆分每个元素,然后将元素插入到临时表中,该函数将作为结果返回。

bsi*_*vel 5

这可以在不使用动态SQL的情况下完成,但是您将需要创建几个支持对象。第一个对象是一个表值函数,它将解析您的字符串并返回一个整数表。第二个对象是一个存储过程,它将具有一个参数,您可以在其中传递字符串(id_list),将其解析为表,然后最终将其连接到查询中。

首先,创建函数以解析字符串:

CREATE FUNCTION [dbo].[String_To_Int_Table]
(
         @list NVARCHAR(1024)
       , @delimiter NCHAR(1) = ',' --Defaults to CSV
)
RETURNS
    @tableList TABLE(
       value INT
       )
AS

BEGIN
   DECLARE @value NVARCHAR(11)
   DECLARE @position INT

   SET @list = LTRIM(RTRIM(@list))+ ','
   SET @position = CHARINDEX(@delimiter, @list, 1)

   IF REPLACE(@list, @delimiter, '') <> ''
   BEGIN
          WHILE @position > 0
          BEGIN 
                 SET @value = LTRIM(RTRIM(LEFT(@list, @position - 1)));
                 INSERT INTO @tableList (value)
                 VALUES (cast(@value as int));
                 SET @list = RIGHT(@list, LEN(@list) - @position);
                 SET @position = CHARINDEX(@delimiter, @list, 1);

          END
   END   
   RETURN
END
Run Code Online (Sandbox Code Playgroud)

现在创建您的存储过程:

    CREATE PROCEDURE ParseListExample
    @id_list as nvarchar(1024)
    AS
    BEGIN

    SET NOCOUNT ON;

    --create a temp table to hold the list of ids
    CREATE TABLE #idTable (ID INT);

    -- use the table valued function to parse the ids into a table.
    INSERT INTO #idTable(ID)
    SELECT Value FROM   dbo.String_to_int_table(@id_list, ',');

    -- join the temp table of ids to the table you want to query...
    SELECT T1.* 
    FROM table1 T1
    JOIN #idTable T2
    on T1.ID = T2.ID
Run Code Online (Sandbox Code Playgroud)

执行示例:

 exec ParseListExample @id_list='1234,23,56,576,1231,567,122,87876,57553,1216'
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助...