我代表那个为我的客户工作的人问这个问题。我实际上比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:
declare @in varchar(10)
set @in = '10,11,12,13'
exec ('SELECT {long field list] FROM {tables} WHERE hour IN (' + @in + ')')
您可以使用一个函数接收包含由管道分隔的“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
您可以使用此存储过程。 我希望对你有用。
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