【问题标题】:SQL string concatenation based on field value基于字段值的 SQL 字符串连接
【发布时间】:2014-02-07 20:20:22
【问题描述】:

我想知道是否有直接在 SQL 中基于字段值连接字符串的直接方法。我知道在应用程序中这样做会更好,但在这种情况下,我只能使用 SQL。例如下表:

Labels | Qty | LabelQty | OutputString
-------+-----+----------+--------------
     1 |  30 |       30 | NULL
     2 |  60 |       30 | NULL
     2 | 120 |       60 | NULL

我想像这样结束 OutputString:

Labels | Qty | LabelQty | OutputString
-------+-----+----------+--------------
     1 |  30 |       30 | 30|
     2 |  60 |       30 | 30|30|
     2 | 120 |       60 | 60|60|

我知道这在 C# 或 VB 中很容易做到,但我很难考虑如何用直接的 SQL 来完成。我是否需要使用游标并一次执行每一行?不幸的是,我不能像在 Ruby 中那样只使用字符串乘法器,例如:

SELECT (CONVERT(VARCHAR(10), LabelQty) + '|') * Labels

任何指针都非常感谢。

【问题讨论】:

  • 输出字符串的输出背后的逻辑是什么?
  • 你必须告诉我们你是如何得到输出字符串的内容的?您是否希望 LabelQty 字段重复次数为 Labels 包含的 | 之间的次数?
  • 重复 LabelQty 的标签次数?
  • 正确,如底部SELECT 所示。重复LabelQty 字段Labels 的次数。
  • dub,底部的选择并不表示因为* 不是字符串的有效运算符,这将导致语法错误。最好使用英语来满足这个要求。

标签: c# sql sql-server vb.net


【解决方案1】:

你可以使用REPLICATE()函数:

select replicate(cast(LabelQty as varchar(100)) + '|', Labels)
from mytable_1

【讨论】:

  • 哇,REPLICATE() 我这辈子都去哪儿了!这正是我想要的,谢谢!
  • @dubstylee - REPLICATE() 正在和你的双胞胎兄弟约会。
  • 1+ 回答太快。我撤回我的回答。
【解决方案2】:

你可以试试

SELECT REPLICATE(CONVERT(VARCHAR(10), LabelQty ) + '|',Labels )

【讨论】:

    【解决方案3】:

    虽然您没有描述如何生成输出字符串,但我认为这可以通过case 表达式来完成:

    http://technet.microsoft.com/en-us/library/ms181765.aspx

    该文章的示例:

    SELECT   ProductNumber, Name, "Price Range" = 
          CASE 
             WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
             WHEN ListPrice < 50 THEN 'Under $50'
             WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
             WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
             ELSE 'Over $1000'
          END
    FROM Production.Product
    ORDER BY ProductNumber ;
    

    【讨论】:

    • 不,显然他希望标签重复与标签列一样多的次数。
    • @Vitaliy 这不是他假装的,不是答案。
    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2018-12-08
    相关资源
    最近更新 更多