【问题标题】:TSQL Case WHEN LIKE REPLACETSQL Case WHEN LIKE REPLACE
【发布时间】:2023-03-20 06:49:01
【问题描述】:

新手问题...寻找基于另一个表中是否存在值来更新新列的最快方法,同时替换值。

例如,下面将“Bought a car”和“car”放在另一个表中。问题是“买了车”在另一张桌子上。

我做了一个 hack 来重新选择值并进行替换,但是如果行更多,性能很糟糕,最多需要 3 到 5 分钟才能执行。

哦,SQL 大师,最好的方法是什么?

例子

            DECLARE @Staging_Table TABLE
        (
         ACCTID INT IDENTITY(1,1),
         NAME VARCHAR(50),
         PURCHASES VARCHAR(255)
         )

        INSERT INTO @Staging_Table (Name, Purchases)
        VALUES ('John','Bought a table')
        INSERT INTO @Staging_Table (Name, Purchases)
        VALUES ('Jack','Sold a car')
        INSERT INTO @Staging_Table (Name, Purchases)
        VALUES ('Mary','Returned a chair')

        DECLARE @HISTORY TABLE
        (
         ACCTID INT IDENTITY(1,1),
         NAME VARCHAR(50),
         Item VARCHAR(255)
         )

        INSERT INTO @HISTORY (Name, Item)
        VALUES ('John','')
        INSERT INTO @HISTORY (Name, Item)
        VALUES ('Jack','')
        INSERT INTO @HISTORY (Name, Item)
        VALUES ('Mary','')

        UPDATE @HISTORY
        Set ITEM = CASE WHEN EXISTS(
                Select ts.Purchases as Output from @Staging_Table ts 
                where ts.NAME = Name AND ts.PURCHASES LIKE '%table%') 
                THEN REPLACE((Select ts2.PURCHASES Output 
                       from @Staging_Table ts2 where ts2.NAME = Name AND ts2.PURCHASES LIKE '%table%'),'Bought a ','') 
        WHEN EXISTS(
                Select ts.Purchases as Output from @Staging_Table ts 
                where ts.NAME = Name AND ts.PURCHASES LIKE '%car%') 
                THEN REPLACE((Select ts2.PURCHASES Output 
                       from @Staging_Table ts2 where ts2.NAME = Name AND ts2.PURCHASES LIKE '%car%'),'Bought a ','') 
        End

        SELECT * FROM @HISTORY

【问题讨论】:

    标签: tsql replace case sql-like exists


    【解决方案1】:
    DECLARE @Staging_Table TABLE
        (
          ACCTID INT IDENTITY(1, 1) ,
          NAME VARCHAR(50) ,
          PURCHASES VARCHAR(255)
        )
    
    INSERT  INTO @Staging_Table
            ( Name, Purchases )
    VALUES  ( 'John', 'Bought a table' ),
            ( 'Jack', 'Sold a car' ),
            ( 'Mary', 'Returned a chair' )
    
    DECLARE @HISTORY TABLE
        (
          ACCTID INT IDENTITY(1, 1) ,
          NAME VARCHAR(50) ,
          Item VARCHAR(255)
        )
    INSERT  INTO @HISTORY
            ( Name, Item )
    VALUES  ( 'John', '' ),
            ( 'Jack', '' ),
            ( 'Mary', '' )
    
    UPDATE  L
    SET     L.ITEM = ( CASE WHEN R.PURCHASES LIKE '%table%'
                            THEN REPLACE(R.PURCHASES, 'Bought a ', '')
                            WHEN R.PURCHASES LIKE '%car%'
                            THEN REPLACE(R.PURCHASES, 'Sold a ', '')
                       END )
    FROM    @HISTORY AS L
            JOIN @Staging_Table AS R ON L.NAME = R.NAME
    WHERE   ( R.PURCHASES LIKE '%table%'
              OR R.PURCHASES LIKE '%car%'
            )
    
    SELECT  *
    FROM    @HISTORY
    

    【讨论】:

    • 再次感谢您的建议。像魅力一样工作。可惜没办法直接联系到你,不然你会找到圣诞礼物... :) 你应该在谷歌上搜索我(去掉空格):na na o56
    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多