【问题标题】:Select Part of Column选择列的一部分
【发布时间】:2012-10-26 13:09:37
【问题描述】:

我想知道是否有人可以帮助查询以选择列的一部分。

“criteriadata”列包含如下所示的数据:

标准数据

14 27 15 ℃

14 30 15 天

14 38 15 次通过

14 33 15 通过

如何只选择出现在数字 15 之后的数据。

非常感谢。

【问题讨论】:

  • 15 会始终显示为第 7 和第 8 个字符吗?为什么不将这些数据存储为四个单独的列?
  • 如果你有很多行,你真的想规范化这些数据。如果没有,也许带有计算列的索引视图将是一种解决方法。查询中的函数(可能禁止聚合函数)是一个好兆头,它会变慢。

标签: sql sql-server sql-server-2005


【解决方案1】:
SELECT RIGHT(CriteriaData, 
             LEN(CriteriaData) - CHARINDEX('15', CriteriaData, 1) - 2)
FROM TableName
WHERE CriteriaData LIKE '%15%';

SQL Fiddle Demo

【讨论】:

  • 这假定以前的值都不包含 15。
【解决方案2】:
declare @T table
(
  CriteriaData varchar(20)
)

insert into @T values
('14 27 15 C'),
('14 30 15 DD'),
('14 38 15 Pass'),
('14 33 15 Pass')

select stuff(CriteriaData, 1, 3+charindex(' 15 ', CriteriaData), '')
from @T  

结果:

---------
C
DD
Pass
Pass

【讨论】:

  • +1 以获得最佳答案 imo。问题应该更具体
  • @dawsonz 只是插入测试数据失败。查询有效。这种插入数据的方式适用于 sql server 2008
  • 啊,是的,谢谢,刚刚测试过它确实有效。谢谢@Mikael
【解决方案3】:

如果CriteriaCData 始终包含由空格分隔的 2 个数字的 3 个数字的模式,那么您总是希望从第 10 个字符中检索:

select SUBSTR(CriteriaCData, 10) from xxx

如果您在 oracle min 10.g 下,则使用 REGEXP_SUBSTR 检索 alpha 模式

SELECT upper(REGEXP_SUBSTR(CriteriaCData, '[a-zA-Z]*$')) FROM xxx

【讨论】:

    【解决方案4】:

    由于您似乎想要从第九个字符开始的所有内容,您可以使用 RIGHTLEN

    SELECT right([CriteriaData], len([CriteriaData]) - 9)
    

    但是,您最好对数据进行规范化,以便它已经在单独的列中。

    【讨论】:

      【解决方案5】:

      在 oracle 上使用 LENGTH 而不是 LEN

      SELECT substr(CriteriaData, 8, LENGTH(CriteriaData) - 9) from table
      

      【讨论】:

        【解决方案6】:

        你应该使用带有左函数的子字符串

        看看这个:How to extract this specific substring in SQL Server?

        还有这个:http://msdn.microsoft.com/en-us/library/aa259342(v=sql.80).aspx

        【讨论】:

          【解决方案7】:

          SELECT substring(criteriadata, 9, LEN(criteriadata)-8) from table

          这里假设 15 的位置是固定的。

          【讨论】:

            【解决方案8】:
            Declare @x nvarchar(100) = '14 30 15 DD';    
            Select substring(@x, (select charindex('15',@x,1) + 2) ,len(@x));
            

            【讨论】:

              【解决方案9】:

              我创建了一个 SQL 函数来按空格分割条件,并使用最后一个空格之后的最后一个剩余值。

              create function dbo.getCriteria
              (
                  @criteria varchar(500)
              ) 
              returns varchar(500)
              begin
                  declare @space as int
                  select @space=charindex(' ', data) from mydata
                  while @space > 0
                  begin
                      set @criteria=substring(@criteria, @space + 1, len(@criteria))
                      select @space=charindex(' ', @criteria)
                  end
                  return @criteria
              end
              
              select dbo.getCriteria(data) from mydata
              

              【讨论】:

                【解决方案10】:
                SELECT 
                  RIGHT(CriteriaData, LEN(CriteriaData) - (CHARINDEX('15', CriteriaData, 1) - 2)) 
                FROM 
                  MyTable;
                

                【讨论】:

                • 虽然有点模棱两可,但您的评论确实是正确的。我已经适当地编辑了我的答案。
                【解决方案11】:

                由于我无法使之前的答案发挥作用,因此我必须找到自己的数字以供将来参考,我将其留在 Stack Overflow 上。我的字段有 XML,但它是一个 NVarchar 字段,应该可以很好地概括 - 如果您对左右环绕的字符串有明确的标准。

                这不是这个问题的完全匹配,但我希望它可以帮助那些在他们的列中有大量字符串并且需要剪掉一个在其他两个之间变化的字符串的人!

                WITH r
                 AS (
                 SELECT TOP 100 RIGHT(XMLData, LEN(XMLData)-CHARINDEX('<INVOICE_NO>', XMLData)-11) AS xmldata
                 FROM IncomingPartsInvoiceXML)
                 SELECT LEFT(xmldata, CHARINDEX('<\/INVOICE_NO>', XMLData)-1)
                 FROM r;
                

                【讨论】:

                  猜你喜欢
                  • 2023-03-19
                  • 2015-02-03
                  • 1970-01-01
                  • 2016-04-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多