【问题标题】:T-SQL compare a Number against a padded number substringT-SQL 将数字与填充数字子字符串进行比较
【发布时间】:2012-03-15 23:55:38
【问题描述】:

问题是 COLA 填充了 0

我正在尝试用 COLA 验证 COLB、COLC、COLD、COLE、COLF

还是我走错了路!

如何获得 COLB、COLD 以将数字 (int) 与填充数字子字符串进行比较?


示例 没错

COLB    COLC    COLD    COLE    COLF               COLA

1        DD      5       1       0                     should = 01DD000510

不是这些

COLB   COLC   COLD  COLE   COLF    COLA

50     AA     230   2       0        0
50     AC     600   3       0
50     AG     740   2       0        50AE074020
50     AS     240   3       0        *0AS024030

 -- select that does not work statement.

 SELECT COLA ,
        COLB ,
        SUBSTRING(COLA, 1, 2) AS 'BLC_COLB' ,
        COLC ,
        SUBSTRING(COLA, 3, 2) AS 'BLC_COLC' ,
        COLD ,
        SUBSTRING(COLA, 5, 4) AS 'BLC_COLD' ,
        COLE ,
        SUBSTRING(COLA, 9, 1) AS 'BLC_COLE' ,
        COLF ,
        SUBSTRING(COLA, 10, 1) AS 'BLC_COLF'
 FROM   ATABLE
 WHERE  SUBSTRING(COLA, 1, 2) NOT LIKE COLB
        OR SUBSTRING(COLA, 3, 2) NOT LIKE COLC
        OR SUBSTRING(COLA, 5, 4) NOT LIKE COLD
        OR SUBSTRING(COLA, 9, 1) NOT LIKE COLE
        OR SUBSTRING(COLA, 10, 1) NOT LIKE COLF

--create table and data script

 CREATE TABLE [dbo].[ATABLE]
    (
      [ROWVERSION] [bigint] NULL ,
      [ROWDATE] [datetime] NULL ,
      [COLB] [int] NOT NULL ,
      [COLC] [nvarchar](2) NOT NULL ,
      [COLD] [int] NOT NULL ,
      [COLE] [nvarchar](1) NOT NULL ,
      [COLF] [int] NOT NULL ,
      [COLA] [nvarchar](14) NULL ,
      CONSTRAINT [CON1_0] PRIMARY KEY CLUSTERED
        ( [COLB] ASC, [COLC] ASC, [COLD] ASC, [COLE] ASC, [COLF] ASC )
        WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
               ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 70 ) ON [PRIMARY]
    )
 ON [PRIMARY]

    GO
 SET NUMERIC_ROUNDABORT OFF
GO
 SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS, NOCOUNT ON
GO
 SET DATEFORMAT YMD
GO
 SET XACT_ABORT ON
GO
 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
 BEGIN TRANSACTION

-- Add 5 rows to [dbo].[ATABLE] with non-unique comparison key
 SET ROWCOUNT 1
 INSERT INTO [dbo].[ATABLE]
        ( [COLB] ,
          [COLC] ,
          [COLD] ,
          [COLE] ,
          [COLF] ,
          [ROWVERSION] ,
          [ROWDATE] ,
          [COLA]
        )
 VALUES ( 1 ,
          N'DD' ,
          5 ,
          N'1' ,
          0 ,
          327520493236000002 ,
          '2011-07-04 10:21:33.227' ,
          N'01DD000510'
        )
 INSERT INTO [dbo].[ATABLE]
        ( [COLB] ,
          [COLC] ,
          [COLD] ,
          [COLE] ,
          [COLF] ,
          [ROWVERSION] ,
          [ROWDATE] ,
          [COLA]
        )
 VALUES ( 50 ,
          N'AA' ,
          230 ,
          N'2' ,
          0 ,
          327520514140000004 ,
          '2011-07-28 09:47:41.013' ,
          N'0'
        )
 INSERT INTO [dbo].[ATABLE]
        ( [COLB] ,
          [COLC] ,
          [COLD] ,
          [COLE] ,
          [COLF] ,
          [ROWVERSION] ,
          [ROWDATE] ,
          [COLA]
        )
 VALUES ( 50 ,
          N'AC' ,
          600 ,
          N'3' ,
          0 ,
          327520523360000007 ,
          '2011-07-28 09:48:09.577' ,
          N''
        )
 INSERT INTO [dbo].[ATABLE]
        ( [COLB] ,
          [COLC] ,
          [COLD] ,
          [COLE] ,
          [COLF] ,
          [ROWVERSION] ,
          [ROWDATE] ,
          [COLA]
        )
 VALUES ( 50 ,
          N'AG' ,
          740 ,
          N'2' ,
          0 ,
          327520543671000002 ,
          '2011-07-28 09:47:03.773' ,
          N'50AE074020'
        )
 INSERT INTO [dbo].[ATABLE]
        ( [COLB] ,
          [COLC] ,
          [COLD] ,
          [COLE] ,
          [COLF] ,
          [ROWVERSION] ,
          [ROWDATE] ,
          [COLA]
        )
 VALUES ( 50 ,
          N'AS' ,
          240 ,
          N'3' ,
          0 ,
          327520586618000007 ,
          '2011-07-28 09:48:08.453' ,
          N'*0AS024030'
        )
 SET ROWCOUNT 0
 COMMIT TRANSACTION

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    执行此操作以选择所有“未验证”的行:

    SELECT  *
    FROM    ATABLE
    WHERE   RIGHT('0' + CAST(COLB AS VARCHAR), 2) +
            COLC +
            RIGHT('000' + CAST(COLD AS VARCHAR), 4) +
            COLE +
            CAST(COLF AS VARCHAR) <> COLA
    

    【讨论】:

    • Dillen, RIGHT('000' + CAST(COLD AS VARCHAR), 4) 它可能并不总是三个 000,它可能是 1、2 或 3 - 0,抱歉数据误导
    • 当前打印所有在 Col A 和 D 中填充 0 的行,因为它们不匹配。
    • 查询(第二个)返回一行,您所说的行在您的问题中是“正确的”。其他四个不包括在内。所以我不确定我是否理解......也许你可以用另一个INSERT 将你的问题更新为ATABLE,这个查询不起作用?
    • 感谢您更新您的问题。我稍微改变了答案。如果您针对您的数据运行该查询,它是否会返回任何被视为已验证的行?
    【解决方案2】:

    在进行比较之前将零填充的数字转换为整数。

    CASE
       WHEN ZeroPadded NOT LIKE '%[^0-9]%'
       THEN CAST(ZeroPadded AS int)
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      相关资源
      最近更新 更多