2014-01-15 77 views
1

我有一個Oracle表,它有一個名爲sql_query的列。所有SQL查詢都放在該列中的所有記錄中。Oracle SQL字符串搜索不帶空格並用空格替換

現在,我看到很多記錄在WHERE子句中的WHERE之前沒有空格。我需要它,因爲該字段命中幾個Web窗體,我得到一個語法錯誤。

例:

Select * from haystackwhere id = 3; 

如何找到這些類型的記錄,並用這樣的空格替換它們:

Select * from haystack where id = 3; 

謝謝!

回答

1

一個簡單的方法是隻使用like操作,假設你的SQL查詢都是簡單(如具有單where條款):

select * 
from table t 
where sql_query like '%where %' and sql_query not like '% where %'; 

你可以很容易地把它變成一個更新:

update table 
    set sql_query = replace(sql_query, 'where ', ' where ') 
    where sql_query like '%where %' and sql_query not like '% where %'; 
1

該查詢將查找列中沒有「WHERE」一詞並且之前有空格的任何實例。然後,如果WHERE在這些記錄存在的話,它會更新到「(空格),其中」

UPDATE Table 
SET SqlQuery = REPLACE(SqlQuery, 'WHERE', ' WHERE') 
WHERE SqlQuery NOT LIKE '% WHERE%' 
+0

謝謝了下來 –

1

如果你的SQL查詢沒有WHERE其他任何地方查詢這樣做只會工作。

例如,如果在查詢中有一個名爲WHERE_LOCATION的字段,這將不起作用。

直接取代SQL查詢:

--YOUR QUERY:

select replace(replace(replace('Select * from haystackwhere id = 3;', 

'where', ' where '), 'WHERE', ' WHERE '), 'Where', ' Where ') from dual;

--If you have WHERE encoded as another case, E.G. wHere, modify appropriately. 

要使用PL/SQL替換:

DECLARE 
    CURSOR C1 IS SELECT SQL_FIELD_COLUMN FROM YOURTABLE; 
    NEW_SQL VARCHAR(1000); 
BEGIN 
    FOR R1 IN C1 
    LOOP 
     --WILL NOT WORK IF SQL_FIELD_COLUMN CONTAINS COLUMNS NAMED WHERE_LOCATION, ETC. 
     --REMEMBER TO Change replacements for other cases, E.G. wHere 
     -- 
     NEW_SQL := replace(replace(replace(R1.SQL_FIELD_COLUMN, 
     'where', ' where '), 'WHERE', ' WHERE '), 'Where', ' Where '); 

     --NOW UPDATE THE TABLE/S CONTAINING YOUR SQL 
    END LOOP; 
END; 
+0

謝謝。得到它了! –