在SQL中删除字符串中的字符

时间:2018-05-24 05:35:38

标签: sql sql-server sql-server-2012

我有一个列u_manualdoc,其中包含的值类似于此CGY DR# 7405。我想删除CGY DR#。 这是代码:

select u_manualdoc, cardcode, cardname from ODLN

我只想要7405个号码。谢谢!

4 个答案:

答案 0 :(得分:1)

试试这个:

--sample data you provided in comments
declare @tbl table(codes varchar(20))
insert into @tbl values
('CGY PST - 58277') , ('CGY RMC PST # 58083'), ('CGY DR # 7443'), ('CSI # 1304'), ('PO# 0568 , 0570'), ('CGY DR# 7446')

--actual query that you can apply to your table
select SUBSTRING(codes, PATINDEX('%[0-9]%', codes), len(codes)) from @tbl

这里的关键点是使用patindex,它搜索模式并返回发生此类模式的索引。我指定了%[0-9]%,这意味着我们搜索任何数字 - 它将返回第一次出现的数字。现在 - 因为这将是我们的子串的起点,我们将它传递给这样的函数。 substring的第三个参数是长度。由于我们需要字符串的其余部分,len函数确保我们得到它:)

申请您的命名:

select SUBSTRING(u_manualdoc, PATINDEX('%[0-9]%', u_manualdoc), len(u_manualdoc)),
       cardcode,
       cardname
from ODLN

答案 1 :(得分:1)

你应该使用字符串函数charindex,len和substring来获取它。 请参阅下面的代码。

Uri imageUri ;
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
{
    imageUri = FileProvider.getUriForFile(context , context.getString(R.string.file_provider_authority), PDFFile);
}
else
{
    imageUri = Uri.fromFile(PDFFile);
}
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_VIEW);
shareIntent.setDataAndType(imageUri , "application/pdf");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(shareIntent);

答案 2 :(得分:1)

修改

除了其他答案,你可以使用这个简单的方法:

select
    substring(
        u_manualdoc,
        len(u_manualdoc) - patindex('%[^0-9]%', reverse(u_manualdoc)) + 2,
        len(u_manualdoc)
    ),
    cardcode, cardname
from ODLN

在此示例中,patindex从字符串的右侧查找第一个非数字(由^[0-9]指定),然后将其用作子字符串的起始点。

这适用于所有示例字符串(包括' PO#0568,0570 CGY DR#7446')。

或者使用SQL Server Regex,它可以让您在查询中使用更强大的正则表达式。

答案 3 :(得分:0)

尝试

DECLARE @table TABLE(DirtyCol VARCHAR(100));
INSERT INTO @table
VALUES('AB ABCDE # 123'), ('ABCDE# 123'), ('AB: ABC# 123 AB: ABC# 123'), ('AB#'), ('AB # 1 000 000'), ('AB # 1`234`567'), ('AB # (9)(876)(543)');
WITH tally
     AS (
     SELECT TOP (100) N = ROW_NUMBER() OVER(ORDER BY @@spid)
     FROM sys.all_columns),
     data
     AS (
     SELECT DirtyCol,
            Col
     FROM @table
          CROSS APPLY
(
    SELECT
(
    SELECT C+''
    FROM
(
    SELECT N,
           SUBSTRING(DirtyCol, N, 1) C
    FROM tally
    WHERE N <= DATALENGTH(DirtyCol)
) [1]
    WHERE C BETWEEN '0' AND '9'
    ORDER BY N FOR XML PATH('')
)
) p(Col)
     WHERE p.Col IS NOT NULL)
     SELECT DirtyCol,
            CAST(Col AS INT) IntCol
     FROM data;