Jump to content
php.lv forumi

Izņemt daļu no rindas pēc patterna


Леший

Recommended Posts

Sveiki, problēma sekojoša:

ir lauks tabulā, kur ir teksts, apmēram šāds:

<text1, text2, >asdf qwer.<, text3>

Vajag tikai ar query izņemt to "asdf qwer.". Viss teksts ir vienā fieldā.

 

EDIT: ar <..> atzīmēju tekstus, kas var nebūt.

Edited by Леший
Link to comment
Share on other sites

Pirmais kas nāk prātā:

Ja runa par Mysql, tad CASE, LOCATE, SUBSTR un iespējams arī SUBSTRING_INDEX kombinācija :)

Ja runa par Oracle, tad CASE, INSTR un SUBSTR kombinācija.

Pie tam INSTR Oraclē var izdarīt krietni vairāk nekā MySqlā, savukārt Oraclē tieši nav f-jas SUBSTRING_INDEX, kas ir MySqlā.

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

Ja izņemamais fragments vienmēr atrodas starp > un <, tad itkā tas ir salīdzinoši vienkārši.

 

update table set field = concat(substr(field, 0, locate(field, '>')), substr(field, locate(field, '<')+1))

 

Ja ir vairāki tādi fragmenti, tad attiecīgi var vnk vairākas reizes palaist, kamēr affected rows=0. Tu gan paskaties, vai viss ir korekti pirms laišanas, jo rakstīju no galvas, netestēju :)

Link to comment
Share on other sites

Kaklz, tu nesaprati, tur nav nekādu < un >, es tos izmantoju, lai atzīmētu tekstus, kas var nebūt.

Precīzēšu:

text1, text2, asdf qwer., text3

textN var neeksistēt, asdf vietā var būt dajebkas, nemainās konkrēti 'qwer.', un ir jāatlasā '<vārds_pirms_qwer.><atstarpe>qwer.'

 

Gints Plivna, MySQL.

Edited by Леший
Link to comment
Share on other sites

'text1, asdf qwer.' > jāatlasā 'asdf qwer.'

'qwer qwer.' > jāatlasā 'qwer qwer.'

'fdsa qwer., text1' > jāatlasā 'fdsa qwer.'

'text1, text2, ftyuj qwer., text3' > jāatlasā 'ftyuj qwer.'

'text1, text2' > jāatlasā ''

 

EDIT: Ērtībai ieboldēju to, ko jāatlasā.

Edited by Леший
Link to comment
Share on other sites

kaut kas šitāds?

 

CREATE TABLE `zz` (
 `id` tinyint(4) NOT NULL auto_increment,
 `z` varchar(200) NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

-- 
-- Dumping data for table `zz`
-- 

INSERT INTO `zz` (`id`, `z`) VALUES 
(1, 'text1, asdf qwer.'),
(2, 'qwer qwer.'),
(3, 'fdsa qwer., text1'),
(4, 'text1, text2, ftyuj qwer., text3'),
(5, 'text1, text2');
SELECT z, trim(leading 'qwer, ' from trim(leading ', ' from concat(
reverse(substring(
 reverse(
   substring(
     z, 
     1, 
     locate('qwer.',z)-2
   )
 ), 
 locate(
   ',',
   reverse(
     substring(
       z, 
       1, 
       locate('qwer.',z)-2
     )
   )
 ) + 1
)), ', ',
 'qwer.', 
  substring(
    z, locate('qwer.',z)+5) ))) FROM `zz` WHERE z like '%qwer.%'

 

ir gan liekas vēl pāris nianses, bet tās arī teorētiski var risināt.

Link to comment
Share on other sites

Izmantoju iepriekšējā atbildētāja laipni izveidotos skriptus, ko posta autors jau nu varēja iedot pats.

mysql> select case when instr(z, 'qwer.') > 0
   ->             then trim(concat(substring_index(
   ->                            substring_index(z, 'qwer.', 1),
   ->                         ' ', -2),
   ->                       'qwer.'))
   ->             else '' end
   -> as result
   -> from zz;
+-------------+
| result      |
+-------------+
| asdf qwer.  |
| qwer qwer.  |
| fdsa qwer.  |
| ftyuj qwer. |
|             |
+-------------+
5 rows in set (0.00 sec)

 

Gints Plivna

http://datubazes.wordpress.com/

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...