只拉动" - "

时间:2016-12-21 14:48:52

标签: sql sql-server tsql

我正在使用T-SQL。 我有这两个字符串。

AX20-xxxxxxxx
T11-xxxxxxxxx

对于第一个我希望能够拉AX

对于第二个,我只想T

4 个答案:

答案 0 :(得分:4)

看看PatIndex()

Declare @S varchar(max) = 'AX20-xxxxxxxx'
Select Left(@S,PatIndex('%[0-9]%',@S)-1)

返回

AX

答案 1 :(得分:3)

假设您需要从开头到第一个数字的出现获取子字符串,请使用PATINDEX获取第一个数字的索引,然后使用SUBSTRING

select substring(colname, 1, patindex('%[0-9]%',colname)-1)
from tablename

答案 2 :(得分:3)

在SQL Server中,您可以使用PATINDEX()获取第一个数字,然后使用LEFT()函数获取左子字符串

WITH T AS 
(
  SELECT 'AX20-xxxxxxxx' as Str
  UNION ALL
  SELECT 'T11-xxxxxxxxx' as Str
)
SELECT LEFT(Str,PATINDEX('%[0-9]%',Str)-1) FROM T

答案 3 :(得分:0)

好的,我很确定这是针对像sql这样的DBMS语言,但我将在Python中发布一个答案。请记住,这可能是 NOT 最有效的解决方案,但却是我能想到的唯一解决方案。它应该很容易实现到任何语言,但我不确定sql。

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        return False

def pulltext(text):
    pulled = []
    for x in text:
        if x == '-':
            index = text.index('-')
            for y in text[:index]:
                  if is_number(y):
                      pass
                  else:
                      pulled.append(y)
    pulled = ''.join(pulled)
    return pulled

textinput = input('String to pull characters from')
print(pulltext(textinput))

由于这是错误的语言,让我们来看看: 如果字符串包含数字,is_number函数返回True,因为python没有这样的东西。

首先我们遍历字符串并找到' - '这是for循环。

然后我们将文本从开头切片到' - '所在的索引 (这就是':'的含义,从开头到' - '的索引)

接下来我们在' - '(for循环)之前浏览每个字符;并检查它是否与前一个函数一致。如果它不是数字,请将其添加到列表中;

最后,只需将列表加入字符串,然后打印该字符串。

我希望有所帮助,并且我倾向于使用错误的语言,但我认为python是解释逻辑的最佳语言:)