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' を要求すると、部分を入力 (@Name) すると Name が単語全体として表示されます

どうすればそれを行うことができますか?

ありがとう

4

6 に答える 6

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 に答える
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 に答える
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 に答える
0

@name は文字列の一部であるため、単語全体として認識されます。このようにコンマで区切る必要があります。「N1」、「N2」。

どのデータベースを使用しているかわかりません。ただし、SQLServer の場合。コンマ区切り文字に基づいて @name 文字列を簡単に分割できます。そしてオラクルで。これも可能です。

SQlServer を使用していて、それができない場合は教えてください。つまり、上記の問題は、コンマを使用して N1 と N2 を分割せず、文字列内に配置したことです。この「N1」、「N2」のように見えるはずです

于 2012-07-16T09:12:42.360 に答える
-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 に答える