【问题标题】:Substring Functions [closed]子字符串函数[关闭]
【发布时间】:2017-03-03 22:15:53
【问题描述】:

需要从Routing numberAccount_Number 列中提取数值

Routing_number 列中的值:

031100225  TOTAL FRAUD,
101190178  NON CASH,
071000288 NOT ON US,
101104407  10 DAY SENT,
065000090    REQ 10 DAY 81615,
101101141, DATED 032409,
101100045, FOR A FORD TAURUS

我需要选择路由号码为 - 031100225,101190178,071000288

Account_number 列中的值:

2079950059473 TOTAL FRAUD,
000480152617 KC MASTER COMP,
2538867, STALE DATE, CHECK
7003475514   FROZEN BLOCKED,
5049530455, NSF CHECK

我需要选择账号为2079950059473,000480152617

我需要一个SUBSTRING 函数来仅选择列中的数字部分。

谢谢

【问题讨论】:

  • 路由号码总是9位数吗?帐号总是一定位数吗?
  • 使用 CHARINDEX 查找第一个空格,嵌入到 Left 函数中。
  • 路由号码为九位数,帐号无限制。
  • 有些值甚至有“,”和“-”符号来表示。所以我需要选择空格前的数字或任何奇怪的符号,如“,”“空格”“。”等
  • SQL take just the numeric values from a varchar 的可能重复项。至于生成逗号分隔列表,请使用 For XML path 在 SQL Server 中组合行。您没有提供足够的信息来了解要组合哪些行(它们如何组合),所以我们所能做的就是提供一个示例。示例here though.

标签: sql-server tsql sql-server-2012 substring


【解决方案1】:

使用 PATINDEX

SELECT LEFT('031100225  TOTAL FRAUD',PATINDEX('%[^0-9]%','031100225  TOTAL FRAUD') - 1)

SELECT LEFT('2079950059473 TOTAL FRAUD,',PATINDEX('%[^0-9]%','2079950059473 TOTAL FRAUD,') - 1)

等等……

SELECT 
    LEFT(Routing_number,PATINDEX('%[^0-9]%',Routing_number) - 1) as ROUT,
    LEFT(Account_number,PATINDEX('%[^0-9]%',Account_number) - 1) as ACCT
FROM 
    YourTable

编辑

SELECT
        CASE
            WHEN Routing_number IS NULL THEN NULL
            WHEN TRY_CONVERT(INT,Routing_number) IS NULL THEN LEFT(Routing_number,PATINDEX('%[^0-9]%',Routing_number) - 1)
            ELSE Routing_number 
        END AS ROUT,
        CASE
            WHEN Account_number IS NULL THEN NULL
            WHEN TRY_CONVERT(INT,Account_number) IS NULL THEN LEFT(Account_number,PATINDEX('%[^0-9]%',Account_number) - 1)
            ELSE  Account_number
        END AS ACCT
    FROM 
        YourTable

使用 ISNUMERIC 代替 TRY_CONVERT

SELECT
        CASE
            WHEN Routing_number IS NULL THEN NULL
            WHEN ISNUMERIC(Routing_number) = 0 THEN LEFT(Routing_number,PATINDEX('%[^0-9]%',Routing_number) - 1)
            ELSE Routing_number 
        END AS ROUT,
        CASE
            WHEN Account_number IS NULL THEN NULL
            WHEN ISNUMERIC(Account_number) = 0 THEN LEFT(Account_number,PATINDEX('%[^0-9]%',Account_number) - 1)
            ELSE  Account_number
        END AS ACCT
    FROM 
        YourTable

【讨论】:

  • 我试过了,它抛出了这个错误。
  • 什么错误...@kris
  • 传递给 LEFT 或 SUBSTRING 函数的长度参数无效。
  • @kris 那么您输入的内容不正确。如果您复制前两行并运行它们,则不会引发错误。如果您在针对数据集运行它时遇到错误,那么您一定有语法问题。确保准确复制它们。
  • 您能否在原始问题中发布更多数据示例。
【解决方案2】:

我创建了一个函数来在我使用的数据库中执行此操作,使查询语法更直接:

CREATE FUNCTION [dbo].[RemoveNonNumericCharacters](@result VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN

    DECLARE @Numbers AS VARCHAR(50) = '%[^0-9]%'
    WHILE PatIndex(@Numbers , @result) > 0
        SET @Temp = Stuff(@result, PatIndex(@Numbers , @result), 1, '')

    RETURN @result
END

示例:

SELECT dbo.RemoveNonNumericCharacters('20sdsdsd sd sdsd3920keosd e20e920e')

返回:

20392020920

SELECT 中使用:

SELECT dbo.RemoveNonNumericCharacters(Routing_number) AS NewValue
FROM [YOUR_TABLE]

【讨论】:

【解决方案3】:

scsimon 精心设计的 PATINDEX 解决方案是可行的方法,但如果您传递空字符串或只包含数字。以下是处理纯数值和空字符串的类似解决方案:

DECLARE @yourTable TABLE (Routing_Number varchar(100));
INSERT @yourTable VALUES 
('031100225 TOTAL FRAUD'),('101190178 NON CASH'),('071000288'),('');

-- This will fail when there's only numbers or the string is empty:
/*
SELECT 
  SUBSTRING
  (
    Routing_Number, 1,
    PATINDEX('%[^0-9]%',Routing_number)-1
  ) AS ROUT
FROM @yourTable;
*/

SELECT 
  SUBSTRING
  (
    Routing_Number, 1,
    ISNULL(NULLIF(PATINDEX('%[^0-9]%',Routing_number)-1,-1),8000)
  ) AS ROUT
FROM @yourTable; 

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    相关资源
    最近更新 更多