2012-07-16 36 views
0

我有這個表:如何從逗號分隔參數中選擇?

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

我想選擇一些名作爲參數:@Name = 'N1,N2',只有越早參數條第1款,從而輸出I將有:

N1 | 1| 
N2 | 8| 

我試過:

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

投入(@Name)的部分確實看到名稱作爲一個整體詞時,我問姓名= 'N1,N2'

任何想法我可以做到這一點?

謝謝

+0

您正在使用什麼數據庫管理系統? – GarethD 2012-07-16 09:06:57

+0

如果您問:如何在'in'子句中設置變量'@ name'的參數,然後看到這個帖子:[參數化SQL IN子句?](http://stackoverflow.com/questions/337704/parameterizing -an-sql-in-clause) – 2012-07-16 09:18:39

+0

作爲[this one]的類似問題(http://stackoverflow.com/a/5614275/183955),更新你的where語句。 – ndrix 2012-07-16 09:11:06

回答

-1

分隔每個名稱與它自己的撇號(')。

SELECT TOP 1 Para1 From MyTable where Name IN ('N1', 'N2') ORDER BY Date ASC 
-1

這個查詢將返回考慮「N1」或「N2」作爲WHERE子句的一部分:

SELECT Name, Para1 FROM <table name> WHERE Name IN('N1','N2') ORDER BY Date ASC 
+0

不,這隻給出一個值,'1' – 2012-07-16 09:56:33

+0

歡迎使用計算器。如果您通過參考和/或一些解釋來改進您的答案,那將會很好。 – Shahbaz 2012-07-16 12:13:46

0

@name被看作是一個完整的單詞,因爲它的一部分串。你應該用這樣的逗號來表達他們。 'N1',N2'。

我不知道你正在使用哪個數據庫。但對於SQLServer。您可以根據逗號分隔符輕鬆分割@name字符串。 和oracle。這也是可能的。

如果你正在使用SQlServer,你不能告訴我。總之,上面的問題是你沒有使用逗號分割N1和N2,你只是把它放在字符串中。 它應該看起來像這樣'N1','N2'

+0

是的請你能告訴我如何在逗號分隔符處分割@name字符串嗎?我正在使用SQL SErver – 2012-07-16 09:14:25

+0

@francopshenri,你會在這篇文章中找到你想要的:[參數化SQL IN子句?](http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-條款) – 2012-07-16 09:22:39

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 
0

是的,如果您使用的是SQL Server 2008+,那麼GarethD指出您可以使用Table Valued Parameter。

如果使用的是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