【问题标题】:How to select from a commas separated parameter?如何从逗号分隔的参数中进行选择?
【发布时间】:2012-07-16 09:04:48
【问题描述】:

我有这张桌子:

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) 视为一个完整的单词

知道我该怎么做吗?

谢谢

【问题讨论】:

  • 您使用的是什么 DBMS?
  • this one类似的问题,更新你的where语句。
  • 如果您在问:如何在in 子句中对变量@name 进行参数化,请参阅这篇文章:Parametrizing an SQL IN clause?

标签: sql sql-server select stored-procedures


【解决方案1】:
SELECT TOP 1 Para1 From MyTable  
where  ','+@Name+',' like '%,'+cast(Name as varchar(100))+',%'
ORDER BY Date ASC  

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,你能告诉我如何在逗号分隔符上分割@name 字符串吗?我正在使用 SQL 服务器
      • @francopshenri,你会在这篇文章中找到你想要的东西:Parameterizing an SQL IN clause?
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          此查询将返回将“N1”或“N2”视为 WHERE 子句的一部分:

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

          【讨论】:

          • 不,这只会给出一个值,'1'
          • 欢迎来到stackoverflow。如果您通过参考和/或一些解释来改进您的答案,那就太好了。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-31
          • 2013-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多