在SQL Server 2000中将字符串拆分为多个值

问题描述 投票:0回答:4

我代表那个为我的客户工作的人问这个问题。我实际上比SQL Server更熟悉mySQL,但遗憾的是,SQL Server是客户端多年来使用的。

问题基本上是这样的:SQL Server中是否有一种方法可以将字符串拆分为多个值(例如数组?),这些值可以在WHERE语句中使用。

这是我正在谈论的PHP示例。

<?php
    $string = "10,11,12,13";
    $explode = explode(",", $string);
?>

$ explode将等于数组(10,11,12,13)。我需要做的是这样的事情:

SELECT {long field list] FROM {tables} WHERE hour IN SPLIT(",", "10,11,12,13")

SPLIT是我执行拆分的伪代码函数

我不是这样做的原因,比方说,PHP,是因为查询是由报告软件构建的,我们无法在将数据发送到数据库之前执行逻辑(例如我的PHP代码),以及多个软件将这些值作为由管道(|)分隔的单个字符串返回。

不幸的是,我没有访问报告软件(我认为他说它被称为Logi或LogiReports或其他东西)或我的同事正在起草的查询,但对于这个问题非常重要的是WHERE子句。

有任何想法吗?

sql-server tsql sql-server-2000
4个回答
3
投票

可以使用动态SQL:

declare @in varchar(10)
set @in = '10,11,12,13'
exec ('SELECT {long field list] FROM {tables} WHERE hour IN (' + @in + ')')

3
投票

这里有几种方法:Arrays and list in SQL Server

对于短弦乐,我更喜欢numbers table

我可以从这里复制/粘贴,但它确实值得一读


1
投票

您可以使用一个函数接收包含由管道分隔的“id”的字符串,并将其作为表返回,您可以在子查询中查询和使用,如下所示:

SELECT {long field list] FROM {tables} WHERE hour IN 
(SELECT OrderID from dbo.SplitOrderIDs('2001,2002'))


ALTER FUNCTION [dbo].[SplitOrderIDs]
(
@OrderList varchar(500)
)
RETURNS 
@ParsedList table
(
OrderID int
)
    AS
    BEGIN
    DECLARE @OrderID varchar(10), @Pos int

SET @OrderList = LTRIM(RTRIM(@OrderList))+ ','
SET @Pos = CHARINDEX(',', @OrderList, 1)

IF REPLACE(@OrderList, ',', '') <> ''
BEGIN
    WHILE @Pos > 0
    BEGIN
        SET @OrderID = LTRIM(RTRIM(LEFT(@OrderList, @Pos - 1)))
        IF @OrderID <> ''
        BEGIN
            INSERT INTO @ParsedList (OrderID) 
            VALUES (CAST(@OrderID AS int)) --Use Appropriate conversion
        END
        SET @OrderList = RIGHT(@OrderList, LEN(@OrderList) - @Pos)
        SET @Pos = CHARINDEX(',', @OrderList, 1)

    END
END 

RETURN
END

0
投票

您可以使用此存储过程。 我希望对你有用。

CREATE PROCEDURE SP_STRING_SPLIT (@String varchar(8000),@Separator Char(10),@pos_select int=0)

AS

BEGIN

SET NOCOUNT ON

DECLARE @Caracter varchar(8000)

DECLARE @Pos int

Set @Pos=1

Set @Caracter=''

CREATE TABLE #ARRAY
    (   String  varchar(8000)   NOT NULL,
        Pos     int         NOT NULL IDENTITY (1, 1)

    )


While (@Pos<=len(@String))
Begin

    If substring(@String,@Pos,1)=Ltrim(Rtrim(@Separator))
        Begin

            INSERT INTO #ARRAY SELECT @Caracter
            SET @Caracter=''
        End
    Else
        Begin   
            --forma la palabra}
            Set @Caracter=@Caracter+substring(@String,@Pos,1)

        End


    If @Pos=len(@String)
        Begin
            INSERT INTO #ARRAY SELECT @Caracter
        End

        SET @Pos=@Pos+1

    End

     SELECT Pos,String FROM #ARRAY where (Pos=@pos_select Or @pos_select=0)
END

 GO

 exec SP_STRING_SPLIT  'HELLO, HOW ARE YOU?',',',0
© www.soinside.com 2019 - 2024. All rights reserved.