SQL如何截取字符串

4

我有一列字符串,每个字符串中包含城市、州和数字。

SPOKANE, WA           232/107
LAS VEGAS, NV         232/117
PORTLAND, OR          232/128

除此之外,还有很多,但我想知道如何在这一列中截取城市和州并仅显示城市和州,或者更好的方法是剪切数字并将城市和州变成一个单独的列。

该列在所有不同记录的情况下都采用相同的格式。

谢谢!


这些数字总是三位数乘三位数吗(例如 111/222)? - Matthew Jones
1
数字总是在列的最后吗?另外,你使用的是什么数据库? - Oded
不,数字并不总是3X3,但它们在最后的格式中是相同的。数据库是MSSQL。 - user380432
针对哪个数据库?每个数据库都存在子字符串功能,但语法不同 - OMG Ponies
如果这只是一次性的任务,我会将其导入Excel中,那里的可能性是无限的。 - Icode4food
我需要用SSRS制作一个报告。 - user380432
6个回答

8

不为您完成所有的工作...

城市:从位置0到第一个逗号的前一位置的列子字符串。
州:从第一个逗号出现后2个位置的列子字符串,到下一个空格为止...修整过的。

参见:SUBSTRING()CHARINDEX()PATINDEX()


3
PATINDEX 很冷门 :/ - OMG Ponies

2
为了去掉末尾的数字,可以使用substring方法,就像这样:
@str = SUBSTRING(@str, LEN(@str)-7, 7)

要将城市和州分开,您需要某种拆分函数,但我无法立即记住语法,对不起。


2

我已经解决了问题并编写了SQL语句...然后我看到了Fosco的答案,但既然我已经有了我的版本,那么我也可以将其发布:

SELECT
    LEFT(yourcolumn, CHARINDEX(',', yourcolumn) - 1) AS City,
    RIGHT(LEFT(yourcolumn, CHARINDEX(',', yourcolumn) + 3), 2) AS State
FROM yourtable

这个算法与Fosco的算法的区别在于,它假设状态恰好为2个字母。如果这不总是正确的,则应使用其他答案。

+1 假定是给定了2个字符的状态,我更喜欢这种方法。 - Fosco

0

我认为这将按照到目前为止提出的所有方式来分解您的字段...

SELECT
   substring([field], 1, patindex('%[1-9]%', [field])-1) as [CITY_AND_STATE],
   substring([field], 1, charindex(',', [field])-1) as [CITY_ONLY],
   substring([field], charindex(',', [field]), patindex('%[1-9]%', [field])-1)) as [STATE_ONLY],
   substring([field], patindex('%[1-9]%', [field]), len([field])) as [NUMBERS_ONLY]
FROM
   [table]

0

编辑 哎呀,刚看到问题是怎么做而不是是否应该做。我猜这就是我的结果。

其他答案都在看substring(),所以我会忽略你问题的那一部分。

关于将它们拆分到不同的列中:如果xxx/yyy与城市和州没有直接相关性,那么我肯定会将它们移到不同的列中。实际上,我会至少有三列:城市、州、[你称之为的代码]

继续编辑 如果它们总是在你的列的右侧,那么用 Right(7, [列名]) 怎么样?


0
考虑使用REVERSE函数。如果您反转字符串,则可以从正常字符串的长度中减去反转字符串中第一个空格的位置,以计算NNN/MMM的起始位置。
这种方法在解析文件路径方面对我非常有效。反转字符串并查找反转字符串中第一个“\”表示路径结束并开始文件名的位置。
如果您的数据格式良好,那么此方法可能比其他一些方法更麻烦。但是当初始数据是“杂乱无章”的时候,这种方法确实可以简化事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接