0

我有这张桌子:

Name | Date | Para1|
N1   | 01/10| 1    |
N2   | 02/10| 8    |
N2   | 04/10| 7    |
N3   | 05/10| 6    |

我想选择一些名称作为参数:@Name = 'N1,N2' 并且只选择较早的参数 para 1,以便输出我将拥有:

N1 | 1|
N2 | 8|

我试过了:

SELECT TOP 1 Para1 From MyTable  where  Name IN ( @Name)  ORDER BY Date ASC 

当我要求 Name = 'N1,N2' 时,将部分 IN (@Name) 视为一个完整的单词

知道我该怎么做吗?

谢谢

4

6 回答 6

1
SELECT TOP 1 Para1 From MyTable  
where  ','+@Name+',' like '%,'+cast(Name as varchar(100))+',%'
ORDER BY Date ASC  
于 2012-07-16T09:12:20.103 回答
1

如果您使用的是 SQL-Server 2008 或更高版本,那么您应该考虑使用表值参数,而不是逗号分隔的列表。下面是如何创建所需类型、创建过程并执行它的示例。

CREATE TYPE dbo.NameList AS TABLE (Name VARCHAR(50) NOT NULL)

GO

CREATE PROCEDURE dbo.GetNames @NameList dbo.NameList READONLY
AS
BEGIN
    SELECT  TOP 1 Para1
    FROM    MyTable 
            INNER JOIN @NameList n
                ON MyTable.Name = n.Name
    ORDER BY Date ASC

END

GO

DECLARE @Names dbo.NameList
INSERT @Names VALUES ('N1'), ('N2')
EXECUTE dbo.GetNames @Names
于 2012-07-16T09:25:28.223 回答
0

@name 被视为一个完整的单词,因为它是字符串的一部分。你应该像这样用逗号分隔它们。'N1',N2'。

我不知道您使用的是哪个数据库。但对于 SQLServer。您可以根据逗号分隔符轻松拆分 @name 字符串。在甲骨文中。这也是可能的。

如果您正在使用 SQlServer 并且您不能这样做,请告诉我。简而言之,上面的问题是您没有使用逗号拆分 N1 和 N2,您只是将其放在字符串中。它应该看起来像这样 'N1' , 'N2'

于 2012-07-16T09:12:42.360 回答
0

是的,如果您使用的是 SQL Server 2008+,那么正如 GarethD 指出的那样,您可以使用表值参数。

如果您使用的是 SQL Server 2005,您可以试试这个:

--SPLIT Function
CREATE FUNCTION [dbo].[SplitUsingXML] 
( 
    @String VARCHAR(MAX),
    --If your delimiter is multi character
    --then change it as VARCHAR with appropriate length 
    @Delimiter CHAR(1) 
)
RETURNS @Results TABLE
(
    parsedValue VARCHAR(MAX)
)   
AS
BEGIN
    DECLARE @xml XML

    --Below line seems to get screwed up once i post it in Blogger :(
    --please use the line as shown in the attached image. Sorry about that.
    SET @XML = N'<Content><row>' + REPLACE(@String, @Delimiter, '</row><row>') + '</row></Content>'


    --If your individual value length within the CSV can be more than 25 characters
    --then you might want to increase it in the below statement
    --pls note it won't throw an error if its more than 25 characters 
    --just that it would truncate and show only the first 25 character :)
    INSERT INTO @Results(parsedValue)
    SELECT row.value('.','VARCHAR(25)') as parsedValue 
    FROM @xml.nodes('//Content/row') AS RECORDS(row)

    RETURN
END
GO


SELECT [name], date, para1
FROM 
(   
    SELECT 
        [name], date, para1, ROW_NUMBER() OVER(PARTITION BY [date] ORDER BY [date] DESC) AS RowNum
    FROM #test a
    WHERE a.[Name] IN (SELECT parsedValue FROM dbo.SplitUsingXML('N1,N2', ','))
) AS WorkTable
WHERE RowNum = 1
于 2012-07-17T02:47:13.563 回答
-1

用它自己的撇号 (') 分隔每个名称。

SELECT TOP 1 Para1 From MyTable  where  Name IN ('N1', 'N2')  ORDER BY Date ASC 
于 2012-07-16T09:08:46.603 回答
-1

此查询将返回考虑 'N1' 或 'N2' 作为 WHERE 子句的一部分:

SELECT Name, Para1 FROM <table name> WHERE Name IN('N1','N2') ORDER BY Date ASC
于 2012-07-16T09:10:19.727 回答