2017-09-14 163 views
1

我有一臺這樣的柱:每個元素在列PostgreSQL的:檢查是否串是一個字符串,如果爲true,則與子更換整個字符串


| biz_name | 
--------------- 
| www.Dog.com | 
| Dog LLC. | 
| Dog Inc. | 
| www.Cat.com | 
| Cat Corp | 

而且,我想檢查它是否包含子字符串'Dog'或'Cat',如果是,則用'Dog'或'Cat'替換整個字符串。

結果應該是:


| biz_name | 
--------------- 
| Dog | 
| Dog | 
| Dog | 
| Cat | 
| Cat | 

有沒有辦法做到這一點不使用情況下則這樣的:

CASE 
    WHEN biz_name ilike '%Dog%' THEN 'Dog' 
    WHEN biz_name ilike '%Cat%' THEN 'Cat' 
    ELSE biz_name END as biz_name  

上表只是爲了演示一下一個例子我試圖做,但我正在處理的實際表中有更多的子字符串,我試圖搜索和替換使用多個CASE WHEN語句可能變得乏味。有沒有人有更有效的方式來做到這一點?謝謝。

+0

不管怎樣..地方,所以我覺得你的方法實際上是最簡單的。 你可以避免重複使用regexp_replace代替兩次Dog,並用找到的「令牌」來代替,但我認爲這沒什麼大不了的。 – Dessma

+0

另一個解決方案是更新'update [tableName] set biz_name ='Dog',其中biz_name如'%dog%'' – Andrei

+1

'帶有subs(s)as(values('Dog'),('Cat')) test(biz_name)as(values('www.dog.com'),('www.cat.com'),('dog Inc.'))select * from test left join subs on(test.biz_name〜* subs .s);' – Abelisto

回答

0

1),你可以做一個快速插入到一個臨時表,你將需要列舉你的狗..貓

--assuming table name is biz 

declare @name varchar(max) 
declare @TEMP table (Name varchar(max)) 

-- insert all your values 
insert into @TEMP values ('dog') 
insert into @TEMP values ('cat') 


set @name = select top 1 name from @TEMP 
delete from @temp where name = @name -- remove from que /table 

WHILE @name IS NOT NULL 
BEGIN 

update dbo.biz 
    set biz_name = @name 
where biz_name like '%' + @name '%' 

set @name = select top 1 name from @TEMP 
delete from @TEMP where name = @name 
END 
+0

這是一個解決方案,是MSSQL我不是100肯定,如果它轉換爲PostgreSQL你可能需要替換** varchar **只有**文本** – Andrei

+0

每一行(但註釋)從你的腳本不會在postgres中完全也不能單獨工作 - 對不起:) –

+0

幾年來一直沒有使用它,但一般概念保持不變。 – Andrei

相關問題