কোনও মাইএসকিউএল ক্ষেত্রের শীর্ষস্থানীয় এবং অনুসরণকারী শ্বেত স্থানটি কীভাবে সরিয়ে ফেলবেন?


134

আমার দুটি ক্ষেত্র (দেশ এবং আইএসও কোড) সহ একটি টেবিল রয়েছে:

Table1

   field1 - e.g. 'Afghanistan' (without quotes)
   field2 - e.g. 'AF'(without quotes)

কিছু সারিতে দ্বিতীয় ক্ষেত্রের শুরুতে এবং / বা শেষে সাদা অংশ থাকে যা কোয়েরিকে প্রভাবিত করে।

Table1

   field1 - e.g. 'Afghanistan' (without quotes) 
   field2 - e.g. ' AF' (without quotes but with that space in front)

ফিল্ড 2-এ সারণীটি দেখতে এবং সাদা স্থানটি সন্ধান / প্রতিস্থাপনের জন্য কি কোনও উপায় আছে (এসকিউএল এ)?


1
এটিকে আরও দৃশ্যমান করার জন্য মন্তব্য হিসাবে আমার উত্তর যুক্ত করা: ঠিক পরিষ্কার করার জন্য, ডিফল্টরূপে ট্রিম কেবল ফাঁকা স্থান সরিয়ে দেয় (সমস্ত শ্বেতস্থান নয়)। এখানে ডকটি রয়েছে: dev.mysql.com/doc/refman/5.0/en/…
mulya

উত্তর:


270

আপনি ট্রিমের সন্ধান করছেন

UPDATE FOO set FIELD2 = TRIM(FIELD2);

19
দ্রষ্টব্য: এটি কেবল নিয়মিত স্পেসগুলি সরিয়ে দেয় এবং অন্যান্য শ্বেতক্ষেত্রের অক্ষরগুলি (ট্যাব, নিউলাইন ইত্যাদি)
টিএম।

30
হ্যাঁ আপনি ঠিক @TM ঠিকঠাক ব্যবহার করেছেন তাই এটি ব্যবহার করা ভাল: আপডেট করুন FOO সেট FIELD2 = ট্রিম (প্রতিস্থাপন (প্রতিস্থাপন (FIELD2, '\ t', '')), '\ n', ''), '\ r' , '')); ইত্যাদি
ক্রিস সিম

9
যদিও @ ক্রিসসিমের সমাধান সামগ্রীটি খুব সহজেই নিউলাইন এবং ট্যাবগুলিকে প্রতিস্থাপন করবে - যা সম্ভবত বেশিরভাগ লোক ট্রিম ফাংশন থেকে চায় না!
JoLoCo

41

আপনার উত্তর এবং অন্যান্য লিঙ্কগুলি থেকে আমি রচনা করেছি এমন একটি সাধারণ উত্তর এবং এটি আমার পক্ষে কাজ করেছে এবং আমি একটি মন্তব্যে এটি লিখেছি:

 UPDATE FOO set FIELD2 = TRIM(Replace(Replace(Replace(FIELD2,'\t',''),'\n',''),'\r',''));

প্রভৃতি

কারণ ট্রিম () সমস্ত সাদা স্পেস সরিয়ে দেয় না তাই আপনি চান সমস্ত সাদা স্পেস প্রতিস্থাপন করা এবং এটি ছাঁটাই করা ভাল।

আশা করি আমি আমার উত্তর ভাগ করে নিতে আপনাকে সহায়তা করতে পারব :)


7
এটি সমস্ত ট্যাব / নিউলাইনগুলি সরিয়ে দেয়। ট্রিমের কেবল স্ট্রিংয়ের উভয় প্রান্তে সাদা স্থান সরিয়ে নেওয়া উচিত।
অসন্তুষ্ট গোয়াট

1
এটি নতুন লাইন চরিত্রগুলি ভাবতে এবং মুছে ফেলার একটি ভাল ধারণা, ধন্যবাদ, একটি কবজির মতো কাজ করে, আমি এটি উত্সাহিত করেছি, এই চিন্তার জন্য বোকোজি @ ক্রিস সিম
সংকর গণেশ ১

25

এই সমাধানটি ব্যবহার করার আগে দয়া করে ব্যবহারের কেসটি বুঝুন:

সিলেক্ট ক্যোয়ারী করার সময় ট্রিম কাজ করে না

এইটা কাজ করে

select replace(name , ' ','') from test;

যদিও এটি হয় না

select trim(name) from test;

9
TRIM()একটি SELECTবিবৃতিতে আমার পক্ষে ভাল কাজ করে , আমি কেন এই উত্তরটি এত বেশি উত্সাহ পেয়েছে তা সম্পর্কে সত্যিই আগ্রহী। আপনি কি মাইএসকিএল ব্যবহার করছেন? কি সংস্করণ?
বিলেণোহ

1
ট্রিম সরানোর জন্য এবং অগ্রবর্তী
অমিচাজার

11
হ্যাঁ এই উত্তরটি ভুল। এটি কীভাবে 50+ আপগেট পেয়েছে?
লোকো

5
এটি কেবল ভুল নয়, এটি বিপজ্জনক। এটি মারাত্মকভাবে কারও ডেটা গারবল করতে পারে।
কিছু-অ-বর্ণনাকারী ব্যবহারকারী

1
আমি হ্রাস পেয়েছি। টেস্টকেস: SELECT CONCAT('"', TRIM(" hello world "), '"') AS `trimmed value` FROM DUALপছন্দসই আউটপুট দেয় "hello world"। প্রতিস্থাপনের রূপটি বিপজ্জনকভাবে শব্দটি পৃথককারী হিসাবে স্থানটিকে সরিয়ে SELECT CONCAT('"', REPLACE(" hello world ", ' ', '')) AS `replaced value` FROM DUAL দেয় : অযাচিত আউটপুট দেয়"helloworld"
পাইমল

17

কেবল স্পষ্ট করে বলতে গেলে, ডিফল্টরূপে টিআরআইএম কেবল ফাঁকা স্থানগুলি সরিয়ে দেয় (সমস্ত সাদা স্থান নয়)। এখানে দস্তাবেজটি দেওয়া হয়েছে: http://dev.mysql.com/doc/refman/5.0/en/string-function.html#function_trim


12
এটি একটি মন্তব্য হিসাবে যুক্ত করা উচিত।
ওয়তুন

11

দেখে মনে হচ্ছে যে বর্তমানের উত্তরগুলির কোনওই কোনও স্ট্রিংয়ের শুরু এবং শেষ থেকে 100% সাদা স্থানকে সরিয়ে ফেলবে না।

অন্যান্য পদে উল্লেখিত ডিফল্ট TRIMনা ট্যাব, formfeeds ইত্যাদি সমন্বয় - শুধুমাত্র ফাঁকা স্থান সরিয়ে ফেলা TRIMঅন্যান্য হোয়াইটস্পেস অক্ষর উল্লেখ সীমিত উন্নতি যেমন প্রদান করতে পারে গুলি TRIM(BOTH '\r' FROM TRIM(BOTH '\n' FROM TRIM(BOTH '\f' FROM TRIM(BOTH '\t' FROM TRIM(txt)))))। তবে এই পদ্ধতির সমস্যাটি কেবলমাত্র একটি নির্দিষ্ট চরিত্রের জন্য নির্দিষ্ট করা যায় TRIMএবং এই অক্ষরগুলি কেবল শুরু এবং শেষ থেকে সরিয়ে দেওয়া হয়। সুতরাং যদি স্ট্রিংটি ছাঁটা হচ্ছে এমন কিছু \t \t \t \t(যেমন বিকল্প স্থান এবং ট্যাব অক্ষর) TRIMএর মতো হয় তবে আরও বেশি সংখ্যক এসের প্রয়োজন হবে - এবং সাধারণ ক্ষেত্রে এটি অনির্দিষ্টকালের জন্য যেতে পারে।

হালকা ওজনের সমাধানের জন্য স্ট্রিংয়ের শুরু এবং শেষে অক্ষরের মধ্য দিয়ে লুপিং করে কাজটি করার জন্য একটি সাধারণ ব্যবহারকারী সংজ্ঞায়িত ফাংশন (ইউডিএফ) লেখা সম্ভব। তবে আমি তা করতে যাচ্ছি না ... কারণ আমি ইতিমধ্যে একটি আরও ভারী ওজনের নিয়মিত এক্সপ্রেশন রিপ্লেসার লিখেছি যা কাজটিও করতে পারে - এবং এই ব্লগ পোস্টে বর্ণিত হিসাবে অন্যান্য কারণে কার্যকর হতে পারে ।

ডেমো

রেক্সটেস্টার অনলাইন ডেমো । বিশেষত, শেষ সারিটি অন্যান্য পদ্ধতি ব্যর্থ হওয়া দেখায় তবে নিয়মিত প্রকাশের পদ্ধতি সফল হয়।

ফাংশন :

-- ------------------------------------------------------------------------------------
-- USAGE
-- ------------------------------------------------------------------------------------
-- SELECT reg_replace(<subject>,
--                    <pattern>,
--                    <replacement>,
--                    <greedy>,
--                    <minMatchLen>,
--                    <maxMatchLen>);
-- where:
-- <subject> is the string to look in for doing the replacements
-- <pattern> is the regular expression to match against
-- <replacement> is the replacement string
-- <greedy> is TRUE for greedy matching or FALSE for non-greedy matching
-- <minMatchLen> specifies the minimum match length
-- <maxMatchLen> specifies the maximum match length
-- (minMatchLen and maxMatchLen are used to improve efficiency but are
--  optional and can be set to 0 or NULL if not known/required)
-- Example:
-- SELECT reg_replace(txt, '^[Tt][^ ]* ', 'a', TRUE, 2, 0) FROM tbl;
DROP FUNCTION IF EXISTS reg_replace;
CREATE FUNCTION reg_replace(subject VARCHAR(21845), pattern VARCHAR(21845),
  replacement VARCHAR(21845), greedy BOOLEAN, minMatchLen INT, maxMatchLen INT)
RETURNS VARCHAR(21845) DETERMINISTIC BEGIN 
  DECLARE result, subStr, usePattern VARCHAR(21845); 
  DECLARE startPos, prevStartPos, startInc, len, lenInc INT;
  IF subject REGEXP pattern THEN
    SET result = '';
    -- Sanitize input parameter values
    SET minMatchLen = IF(minMatchLen < 1, 1, minMatchLen);
    SET maxMatchLen = IF(maxMatchLen < 1 OR maxMatchLen > CHAR_LENGTH(subject),
                         CHAR_LENGTH(subject), maxMatchLen);
    -- Set the pattern to use to match an entire string rather than part of a string
    SET usePattern = IF (LEFT(pattern, 1) = '^', pattern, CONCAT('^', pattern));
    SET usePattern = IF (RIGHT(pattern, 1) = '$', usePattern, CONCAT(usePattern, '$'));
    -- Set start position to 1 if pattern starts with ^ or doesn't end with $.
    IF LEFT(pattern, 1) = '^' OR RIGHT(pattern, 1) <> '$' THEN
      SET startPos = 1, startInc = 1;
    -- Otherwise (i.e. pattern ends with $ but doesn't start with ^): Set start position
    -- to the min or max match length from the end (depending on "greedy" flag).
    ELSEIF greedy THEN
      SET startPos = CHAR_LENGTH(subject) - maxMatchLen + 1, startInc = 1;
    ELSE
      SET startPos = CHAR_LENGTH(subject) - minMatchLen + 1, startInc = -1;
    END IF;
    WHILE startPos >= 1 AND startPos <= CHAR_LENGTH(subject)
      AND startPos + minMatchLen - 1 <= CHAR_LENGTH(subject)
      AND !(LEFT(pattern, 1) = '^' AND startPos <> 1)
      AND !(RIGHT(pattern, 1) = '$'
            AND startPos + maxMatchLen - 1 < CHAR_LENGTH(subject)) DO
      -- Set start length to maximum if matching greedily or pattern ends with $.
      -- Otherwise set starting length to the minimum match length.
      IF greedy OR RIGHT(pattern, 1) = '$' THEN
        SET len = LEAST(CHAR_LENGTH(subject) - startPos + 1, maxMatchLen), lenInc = -1;
      ELSE
        SET len = minMatchLen, lenInc = 1;
      END IF;
      SET prevStartPos = startPos;
      lenLoop: WHILE len >= 1 AND len <= maxMatchLen
                 AND startPos + len - 1 <= CHAR_LENGTH(subject)
                 AND !(RIGHT(pattern, 1) = '$' 
                       AND startPos + len - 1 <> CHAR_LENGTH(subject)) DO
        SET subStr = SUBSTRING(subject, startPos, len);
        IF subStr REGEXP usePattern THEN
          SET result = IF(startInc = 1,
                          CONCAT(result, replacement), CONCAT(replacement, result));
          SET startPos = startPos + startInc * len;
          LEAVE lenLoop;
        END IF;
        SET len = len + lenInc;
      END WHILE;
      IF (startPos = prevStartPos) THEN
        SET result = IF(startInc = 1, CONCAT(result, SUBSTRING(subject, startPos, 1)),
                        CONCAT(SUBSTRING(subject, startPos, 1), result));
        SET startPos = startPos + startInc;
      END IF;
    END WHILE;
    IF startInc = 1 AND startPos <= CHAR_LENGTH(subject) THEN
      SET result = CONCAT(result, RIGHT(subject, CHAR_LENGTH(subject) + 1 - startPos));
    ELSEIF startInc = -1 AND startPos >= 1 THEN
      SET result = CONCAT(LEFT(subject, startPos), result);
    END IF;
  ELSE
    SET result = subject;
  END IF;
  RETURN result;
END;

DROP FUNCTION IF EXISTS format_result;
CREATE FUNCTION format_result(result VARCHAR(21845))
RETURNS VARCHAR(21845) DETERMINISTIC BEGIN
  RETURN CONCAT(CONCAT('|', REPLACE(REPLACE(REPLACE(REPLACE(result, '\t', '\\t'), CHAR(12), '\\f'), '\r', '\\r'), '\n', '\\n')), '|');
END;

DROP TABLE IF EXISTS tbl;
CREATE TABLE tbl
AS
SELECT 'Afghanistan' AS txt
UNION ALL
SELECT ' AF' AS txt
UNION ALL
SELECT ' Cayman Islands  ' AS txt
UNION ALL
SELECT CONCAT(CONCAT(CONCAT('\t \t ', CHAR(12)), ' \r\n\t British Virgin Islands \t \t  ', CHAR(12)), ' \r\n') AS txt;     

SELECT format_result(txt) AS txt,
       format_result(TRIM(txt)) AS trim,
       format_result(TRIM(BOTH '\r' FROM TRIM(BOTH '\n' FROM TRIM(BOTH '\f' FROM TRIM(BOTH '\t' FROM TRIM(txt))))))
         AS `trim spaces, tabs, formfeeds and line endings`,
       format_result(reg_replace(reg_replace(txt, '^[[:space:]]+', '', TRUE, 1, 0), '[[:space:]]+$', '', TRUE, 1, 0))
         AS `reg_replace`
FROM tbl;

ব্যবহার:

SELECT reg_replace(
         reg_replace(txt,
                     '^[[:space:]]+',
                     '',
                     TRUE,
                     1,
                     0),
         '[[:space:]]+$',
         '',
         TRUE,
         1,
         0) AS `trimmed txt`
FROM tbl;

4

এই বিবৃতিটি আপনার ডাটাবেসের ক্ষেত্রের সামগ্রীগুলি সরিয়ে এবং আপডেট করবে

ক্ষেত্রের মানটির বাম দিকে সাদা স্থানগুলি সরাতে

টেবিল SET ফিল্ড 1 আপডেট করুন = এলটিআরআইএম (ফিল্ড 1);

প্রাক্তন। আপডেট আপডেট সদস্য SET firstName = LTRIM (প্রথম নাম);

ক্ষেত্রের মানটির ডানদিকে সাদা স্থানগুলি সরাতে

আপডেট টেবিল SETfield1 = আরটিআরআইএম (ফিল্ড 1);

প্রাক্তন। আপডেট আপডেট সদস্য SET firstName = আরটিআরআইএম (প্রথম নাম);


2

আমার প্রথম এবং শেষ নামগুলির একটি প্রাথমিক কী কলামে মানগুলি ট্রিম করতে হবে, তাই আমি সমস্ত সাদা স্থান ছাঁটাইতে চাইনি কারণ এটি প্রথম এবং শেষ নামের মধ্যে থাকা স্থানটি সরিয়ে ফেলবে, যা আমার রাখা দরকার ছিল। আমার জন্য যা কাজ করেছিল তা ছিল ...

UPDATE `TABLE` SET `FIELD`= TRIM(FIELD);

অথবা

UPDATE 'TABLE' SET 'FIELD' = RTRIM(FIELD);

অথবা

UPDATE 'TABLE' SET 'FIELD' = LTRIM(FIELD);

নোট করুন যে FIELD এর প্রথম উদাহরণটি একক উদ্ধৃতিতে রয়েছে তবে দ্বিতীয়টি মোটেও উদ্ধৃতিতে নেই। আমাকে এইভাবে এটি করতে হয়েছিল বা এটি আমার একটি বাক্য বাক্য বলেছিল যে এটি একটি সদৃশ প্রাথমিক কী ছিল যখন আমার উভয় উদ্ধৃতি ছিল।


1

আপনার যদি নির্বাচিত ক্যোয়ারিতে ট্রিম ব্যবহার করার প্রয়োজন হয় তবে আপনি নিয়মিত এক্সপ্রেশনও ব্যবহার করতে পারেন

SELECT * FROM table_name WHERE field RLIKE ' * query-string *'

'ক্যোরি-স্ট্রিং' এর মতো ক্ষেত্র সহ সারিগুলি ফেরত দিন


0

আপনি ডান বা বাম বা একটি স্ট্রিংয়ের জন্য সাদা জায়গাগুলি পরিষ্কার করতে ltrim বা rtrim ব্যবহার করতে পারেন।



-5

আমি এটি ইতিমধ্যে স্বীকৃত জানি, তবে আমার মতো যারা "সমস্ত সাদা স্থান সরিয়ে ফেলুন" সন্ধান করেন (কেবল সূত্রপাতের শুরু এবং শেষের দিকে নয়):

select SUBSTRING_INDEX('1234 243', ' ', 1);
// returns '1234'

সম্পাদনা 2019/6/20: হ্যাঁ, এটি ভাল নয়। "যখন প্রথমবারের জন্য অক্ষর স্থানটি হয়েছিল" তখন থেকে ফাংশনটি স্ট্রিংয়ের অংশটি দেয় returns সুতরাং, আমি অনুমান করি যে এটি বলার ফলে নেতৃস্থানীয় এবং ট্রেইলিং হোয়াইটস্পেসগুলি সরানো হবে এবং প্রথম শব্দটি ফিরে আসে:

select SUBSTRING_INDEX(TRIM(' 1234 243'), ' ', 1);

5
ওপির সাথে এর কোনও প্রাসঙ্গিকতা নেই।
মিকম্যাকুসা

4
ওহ, আপনি সমস্ত সাদা স্থান সরিয়ে দিচ্ছেন না - আপনি প্রথম স্থান থেকে সমস্ত কিছু সরিয়ে দিচ্ছেন ।
টিমো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.