1

我正在选择如下值:

select browser, firstname, lastname from details

这里的浏览器值将是这样的:

33243@Firefox@dsfsd
34234@google@dfsd

我分别对单个值使用了拆分函数,如下所示:

select * from dbo.split('33243@Firefox@dsfsd','@')

结果是:

items
===========
33243
firefox
dsfsd

所以我使用了如下的拆分功能

select split(browser, '@'), firstname, lastname from details

但它不工作......

我需要的是

33243@Firefox@dsfsd

不必将这样的值显示到网格中,而必须仅将 Firefox 显示到网格中。

4

4 回答 4

1

由于您知道每次都需要第二个元素,因此您可以编写如下函数:


CREATE FUNCTION [dbo].[fn_SplitElement] 
(
    @inputString nvarchar(2000),    --The input string
    @elem   int,    --The 1-based element index to return,
    @delimiter nvarchar(1)  --The delimiter char
)
RETURNS nvarchar(2000)
AS
BEGIN
    -- Declare the return variable here
    DECLARE @result nvarchar(2000)

    -- Add the T-SQL statements to compute the return value here
    SELECT @result = value
    FROM
    (
        SELECT *,ROW_NUMBER() OVER(ORDER By Position) as rownum FROM dbo.split(@inputString,@delimiter)
    ) as t
    WHERE rownum=@elem

    -- Return the result of the function
    RETURN @result

END

GO

然后你可以调用:


select [dbo].[fn_SplitElement](browser,2,'@') as 'BrowserName', firstname, lastname from details
于 2012-08-31T07:35:33.233 回答
0

您没有说明您使用的是哪个版本的 SQL Server 或哪个拆分功能。但是,大多数拆分函数返回一个表而不是行,因此您需要使用 JOIN 来连接两个表(第一个是拆分,第二个是其余字段)。

有关 SQL 拆分函数的更多信息,请参阅 Erland Sommarskog 的页面http://www.sommarskog.se/arrays-in-sql.html

于 2012-08-31T05:55:54.330 回答
0

我使用了下面的查询而不是使用拆分功能..它工作得很好..

 select 
        SUBSTRING(SUBSTRING(browser, CHARINDEX ('@', browser)+1,LEN(browser)-charindex('@', browser)),
        0,
        CHARINDEX('@',SUBSTRING(browser, CHARINDEX ('@', browser)+1,LEN(browser)-CHARINDEX('@', browser)))),
    firstname, lastname from details
于 2012-08-31T09:26:41.257 回答
0

您可以创建一个拆分功能,并在您需要时使用。

CREATE FUNCTION [dbo].[Split]
(   
    @List nvarchar(max),
    @SplitOn nvarchar(1)
)
RETURNS @RtnValue table (
    Id int identity(1,1),
    Value nvarchar(max)
)
AS
BEGIN
    While (Charindex(@SplitOn,@List)>0)
    Begin 
        Insert Into @RtnValue (value)
        Select 
            Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 
        Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
    End 

    Insert Into @RtnValue (Value)
    Select Value = ltrim(rtrim(@List))

    Return
END

之后,您可以在查询中调用该函数,如下所示。

SELECT * FROM anotherTable WHERE user_id IN(dbo.split(@user_list,','))
于 2012-08-31T07:19:52.033 回答