字符串操作SQL

字符串操作SQL,sql,sql-server,Sql,Sql Server,我有一行字符串,格式如下: '订单已分配给lastname,firsname' 我需要将这个字符串缩减为姓氏和名,但每个记录的名称总是不同的 “订单分配给”零件始终相同 谢谢 我正在使用SQL Server。每个记录中有多个名称不同的记录。在您的特定情况下,您可以使用以下内容: SELECT SUBSTRING(str, 23) FROM table 但是,如果字符串的格式发生变化,那么这种方法的可伸缩性不是很强 如果您使用的是Oracle数据库,您可能希望改用SUBSTR 编辑: 对于第三

我有一行字符串,格式如下:

'订单已分配给lastname,firsname'

我需要将这个字符串缩减为姓氏和名,但每个记录的名称总是不同的


“订单分配给”零件始终相同

谢谢


我正在使用SQL Server。每个记录中有多个名称不同的记录。

在您的特定情况下,您可以使用以下内容:

SELECT SUBSTRING(str, 23) FROM table
但是,如果字符串的格式发生变化,那么这种方法的可伸缩性不是很强

如果您使用的是Oracle数据库,您可能希望改用
SUBSTR


编辑:

对于第三个参数不是可选的数据库,可以使用
子字符串(str,23,LEN(str))


有人必须进行测试,看看这是比减法更好还是更差,但最终会给出相同的结果。

在您的特定情况下,您可以使用以下方法:

SELECT SUBSTRING(str, 23) FROM table
但是,如果字符串的格式发生变化,那么这种方法的可伸缩性不是很强

如果您使用的是Oracle数据库,您可能希望改用
SUBSTR


编辑:

对于第三个参数不是可选的数据库,可以使用
子字符串(str,23,LEN(str))

有人必须测试一下这是比减法好还是比减法差,但最终会给出相同的结果。

对于SQL Server

   WITH testData AS
    (
    SELECT 'Order was assigned to lastname,firsname' as Col1 UNION ALL
    SELECT 'Order was assigned to Bloggs, Jo' as Col1
    )

    SELECT SUBSTRING(Col1,23,LEN(Col1)-22) AS Name
    from testData
返回

Name

---------------------------------------
lastname,firsname
Bloggs, Jo
对于SQL Server

   WITH testData AS
    (
    SELECT 'Order was assigned to lastname,firsname' as Col1 UNION ALL
    SELECT 'Order was assigned to Bloggs, Jo' as Col1
    )

    SELECT SUBSTRING(Col1,23,LEN(Col1)-22) AS Name
    from testData
返回

Name

---------------------------------------
lastname,firsname
Bloggs, Jo

我需要在消息和名称之间使用冒号或其他分隔符。 然后你就可以搜索这个字符的索引,知道它之后的任何东西都是你需要的数据

格式随时间变化的示例:

CREATE TABLE #Temp (OrderInfo NVARCHAR(MAX))
INSERT INTO #Temp VALUES ('Order was assigned to :Smith,Mary')
INSERT INTO #Temp VALUES ('Order was assigned to :Holmes,Larry')
INSERT INTO #Temp VALUES ('New Format over time :LootAt,Me')


SELECT      SUBSTRING(OrderInfo, CHARINDEX(':',OrderInfo)+1, LEN(OrderInfo))
FROM        #Temp


DROP TABLE #Temp

我需要在消息和名称之间使用冒号或其他分隔符。 然后你就可以搜索这个字符的索引,知道它之后的任何东西都是你需要的数据

格式随时间变化的示例:

CREATE TABLE #Temp (OrderInfo NVARCHAR(MAX))
INSERT INTO #Temp VALUES ('Order was assigned to :Smith,Mary')
INSERT INTO #Temp VALUES ('Order was assigned to :Holmes,Larry')
INSERT INTO #Temp VALUES ('New Format over time :LootAt,Me')


SELECT      SUBSTRING(OrderInfo, CHARINDEX(':',OrderInfo)+1, LEN(OrderInfo))
FROM        #Temp


DROP TABLE #Temp
在MS SQL Server上:

declare @str varchar(100) = 'Order was assigned to lastname,firsname'
declare @strLen1 int = DATALENGTH('Order was assigned to ')
declare @strLen2 int = len(@str)
select @strlen1, @strLen2, substring(@str,@strLen1,@strLen2), 
                  RIGHT(@str, @strlen2-@strlen1)
在MS SQL Server上:

declare @str varchar(100) = 'Order was assigned to lastname,firsname'
declare @strLen1 int = DATALENGTH('Order was assigned to ')
declare @strLen2 int = len(@str)
select @strlen1, @strLen2, substring(@str,@strLen1,@strLen2), 
                  RIGHT(@str, @strlen2-@strlen1)

除了SUBSTRING方法之外,还可以使用REPLACE函数。我不知道哪一个会在数百万行上有更好的性能,尽管我怀疑它会是子字符串——特别是如果您使用CHAR而不是VARCHAR

SELECT REPLACE(my_column, 'Order was assigned to ', '')

除了SUBSTRING方法之外,还可以使用REPLACE函数。我不知道哪一个会在数百万行上有更好的性能,尽管我怀疑它会是子字符串——特别是如果您使用CHAR而不是VARCHAR

SELECT REPLACE(my_column, 'Order was assigned to ', '')

什么是RDBMS?这取决于答案。我假设您希望在查询/使用SQL中执行此操作?当您说“一行字符串”时,是指多个列,每个列包含一个字符串,还是指多个行,每个行包含一列字符串?SQL的术语大致相当于:行=记录,列=字段。“订单分配给”部分总是一样的……“如果总是一样的话,那么将其存储在数据库中有什么意义呢?”头上钉着一颗钉子。我急于冲出子串函数,我没有想到!什么是RDBMS?这取决于答案。我假设您希望在查询/使用SQL中执行此操作?当您说“一行字符串”时,是指多个列,每个列包含一个字符串,还是指多个行,每个行包含一列字符串?SQL的术语大致相当于:行=记录,列=字段。“订单分配给”部分总是一样的……“如果总是一样的话,那么将其存储在数据库中有什么意义呢?”头上钉着一颗钉子。我急于冲出子串函数,我没有想到!子字符串中是否需要3个参数?好的,第三个参数(长度)是可选的。只有两个参数,它将从开始位置一直到结束。但是,与SQL世界中的其他内容一样,这可能取决于特定的实现。在SQL Server
Msg 174,级别15,状态1,第7行中,子字符串函数需要3个参数。
对于SQL Server(至少2008年),情况并非如此。第三个参数是必需的。第三个参数是可选的。-子字符串中是否需要3个参数?好的,第三个参数(长度)是可选的。只有两个参数,它将从开始位置一直到结束。但是,与SQL世界中的其他内容一样,这可能取决于特定的实现。在SQL Server
Msg 174,级别15,状态1,第7行中,子字符串函数需要3个参数。
对于SQL Server(至少2008年),情况并非如此。第三个参数是必需的。第三个参数是可选的。-这样他们就可以把前线的信息变成未来的信息。规则是数据在分隔符之后…这样他们就可以将前面的消息更改为将来的消息。规则是数据在分隔符之后。。。