ลบอักขระพิเศษ ch(191) และ SQL อื่นๆ

มือใหม่หัดใช้สคริปต์ Unix และคำสั่ง Oracle จึงเป็นเรื่องง่าย...

ฉันมีฟิลด์ที่เต็มไปด้วยอักขระที่ไม่ถูกต้องและโดยเฉพาะ chr(191) ' inverted ? เข้าสู่ระบบ'..

ฉันมีโค้ดตัวอย่างนี้

UPDATE rc.rc_descripton
SET desc_description = 
                        (
                         CASE 
                            WHEN desc_description LIKE '%[^a-zA-Z0-9]%' 
                                  THEN Replace(REPLACE( desc_description, SUBSTRING( desc_description, PATINDEX('%[~,@,#,$,%,&,*,^,&,%,*,(,)]%', desc_description), 1 ),''),'-',' ')
                            ELSE desc_description
                          END
                         )

แม้ว่าคำสั่ง UPDATE ดั้งเดิมของฉันคือ: -

UPDATE rc.rc_description
SET    desc_description  = REPLACE(desc_description, CHR(191), ' ')
WHERE  desc_description LIKE '%' || CHR(191) || '%'

ฉันต้องการรวมโค้ดข้างต้นเข้ากับโค้ดตัวอย่างหลักที่ฉันโพสต์ไว้ด้านบน

ฉันพบสคริปต์ยูนิกซ์ที่ใช้ก่อนหน้านี้:

# Replace offending characters with the intending/valid characters 

sed s/–/-/g $1 | sed s/’/\'/g | sed s/‘/\'/g | sed s//\'/g | sed s//\'/g | sed s//\"/g | sed s//\"/g | sed s/“/\"/g | sed s/”/\"/g | sed s/—/-/g | sed s//-/g | sed s/…/.../g | sed s/‑/-/g | sed 's/½/1\/2/g' | sed 's/¼/1\/4/g' | sed 's/¾/3\/4/g' | sed 's/· //g' | sed s/°/./g | sed s/•/*/g | sed s/ //g > $1.out

แต่ฉันไม่สามารถแปลโค้ดยูนิกซ์เป็นคำสั่งอัพเดตของ Oracle ได้

กรุณาแนะนำคำสั่ง UPDATE ที่ถูกต้องเพื่อรองรับชุดอักขระพิเศษทั้งหมดข้างต้น และคำนึงถึง CHR(191) ด้วย...

ขอแสดงความนับถือ A.B.


person abby    schedule 11.01.2016    source แหล่งที่มา
comment
ฤvertedษี ? ขยาย ASCII 168 ไม่ใช่ 191 หรือไม่ บางทีคุณอาจเห็นสัญลักษณ์นั้นเนื่องจากไคลเอนต์ของคุณไม่ได้ตั้งค่าให้แสดงอักขระ (UTF) ทั้งหมดอย่างถูกต้อง ชุดอักขระใดคือเซสชันฐานข้อมูล ไคลเอ็นต์ และระบบปฏิบัติการของคุณ และคุณแน่ใจจริงๆ หรือไม่ว่าต้องการถอดอักขระพิเศษและลดข้อความที่เก็บไว้เป็น US7ASCII   -  person Alex Poole    schedule 11.01.2016
comment
ข้อความต้นฉบับ. หน่วยที่ 1 กล่าวว่า "ฉันขอโทษ" XXXX ไม่สามารถรับเวอร์ชันเต็มจากหน่วยที่ 1 ได้เนื่องจากอาการบาดเจ็บของเธอและคำขอ QAS ที่ข้อความที่แปลงแล้ว : ได้ระบุว่า ¿ฉันขอโทษ¿ XXXX ไม่สามารถรับเวอร์ชันเต็มจากหน่วยที่ 1 ได้ เนื่องจากตามหลักการแล้ว ฉันต้องการดูข้อความต้นฉบับ แต่สำหรับเวอร์ชัน 9i ดูเหมือนจะไม่สามารถรับฟังก์ชันที่เทียบเท่ากับที่ใช้โดย 10g หรือสูงกว่าได้   -  person abby    schedule 13.01.2016
comment
NLS_LANG หรือภาษาระบบปฏิบัติการของคุณตั้งค่าไว้เป็นเท่าใด และชุดอักขระฐานข้อมูลของคุณ? ดูเหมือนว่าปัญหาการแสดงผล - ลูกค้าของคุณแสดงอักขระ Unicode ไม่ถูกต้อง สมมุติว่าคุณมีเครื่องหมายคำพูด 'ฉลาด' เช่น ” “ ’ ‘ ในสตริงที่เก็บไว้ และลูกค้าของคุณไม่ทราบวิธีเรนเดอร์ ซึ่งโดยปกติแล้วจะเป็นปัญหาเกี่ยวกับการตั้งค่า   -  person Alex Poole    schedule 13.01.2016
comment
NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET WE8ISO8859P1 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_LENGTH_S EMANTICS ไบต์ NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_RDBMS_VERSION 9.2.0.8.0   -  person abby    schedule 14.01.2016


คำตอบ (2)


ฉันได้รับข้อความต่อไปนี้ที่เหมาะกับฉัน: -

 select desc_description,
  length(dbms_lob.substr(desc_description, 3500, 1)) len,
  lengthb(dbms_lob.substr(desc_description, 3500, 1)) lenb,

  convert(replace(translate(dbms_lob.substr(desc_description, 3500, 1), ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-=`~!@#$%^&*()_+,./<>?;'':"[]\{}|',' '), ' ', ''),'us7ascii') bad_char_replaced,

  rawtohex(convert(replace(translate(dbms_lob.substr(desc_description, 3500, 1), ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-=`~!@#$%^&*()_+,./<>?;'':"[]\{}|',' '), ' ', ''),'us7ascii')) bad_char_replaced_hex ,
  -------
  convert(dbms_lob.substr(desc_description, 3500, 1),'us7ascii') converted
  -------
  from rc.rc_description

  WHERE  desc_description LIKE '%' || CHR(191) || '%' and
  desc_cras_number = '20140096849';

ข้อความก่อนหน้าคือ : เสา B ของรถมี ......

ข้อความ After คือ เสา B ของรถมี ......

ฉันขอคำค้นหาข้างต้นเพื่อลบสิ่งเหล่านี้ได้ไหม ??? เครื่องหมายอัญประกาศเดี่ยวหรือเครื่องหมายคำพูดคู่ ? หรือถ้าข้อมูลนั้นทำให้ข้อมูลเสียหาย jst ให้ใช้พื้นที่ว่าง

person abby    schedule 13.01.2016

ลองสิ่งนี้แทนที่อินพุตด้วยสตริงของคุณและ regex ใช้สำหรับตัวอักษรและตัวเลขคุณสามารถจัดการได้อย่างง่ายดาย T-SQL SYNTAX

DECLARE @input AS NVARCHAR(MAX) = '124567890qwertyuioopasdfghjklzx cvbnm,;#$%^&*(!)$^'
DECLARE @output AS NVARCHAR(MAX) = @input
DECLARE @RegexString AS NVARCHAR(max) = '[^a-zA-Z0-9 ]'

WHILE PATINDEX('%'+@RegexString+'%',@output)>0
BEGIN
    SET     @output=  STUFF(@output,PATINDEX('%'+@RegexString+'%',@output),1,'')
    PRINT   @output
END

SELECT @input , @output
person Abdul Hannan Ijaz    schedule 11.01.2016
comment
นั่นไม่ใช่ไวยากรณ์ของ Oracle - person Alex Poole; 11.01.2016
comment
ใช่ ฉันใช้ 9i ดังนั้นแม้แต่ REGEX ก็ใช้งานไม่ได้... พยายามใช้ OWA_PATTERN.AMATCH แต่ก็ไร้ผล มีเบาะแสใด ๆ เกี่ยวกับสิ่งที่ฉันสามารถใช้กับเวอร์ชันเทียบเท่าของ Oracle 9i ได้ - person abby; 13.01.2016