Отдельно извлекать числовые и специальные символы - PullRequest
4 голосов
/ 02 июня 2011

У меня есть столбец в таблице со значениями, хранящимися как

Cost

499.00
£ 7.75
£ 7.75
250.00
£ 5.99
$ 6.05

Теперь мне нужно сохранить эти значения в другой таблице, например

Currency     Cost
RS           499.00
£            7.75
£            7.75 
RS           250.00 
£            5.99 
$            6.05   

Плз, дайте мне запрос, как это сделать ....

Ответы [ 5 ]

4 голосов
/ 02 июня 2011
insert DestinationTable(Cost, Currency)
select
    case when delimiterIndex > 0 then left(Cost, delimiterIndex) else 'RS' end as Currency,
    right(Cost, len(Cost) - delimiterIndex) as Cost
from
(
    select charindex(' ', Cost) delimiterIndex, *
    from SourceTable
) tt
0 голосов
/ 02 июня 2011
SELECT
  Currency = COALESCE(NULLIF(LEFT(Cost, CostStart - 1), ''), 'RS'),
  Cost = SUBSTRING(Cost, CostStart, LEN(Cost) - CostStart + 1)
FROM (
  SELECT
    Cost,
    CostStart = PATINDEX('%[0-9]%', Cost)
  FROM atable
) s

Это будет работать, даже если между символом валюты и суммой нет пробела.

0 голосов
/ 02 июня 2011

Вы можете создать регулярную сборку CLR, например, one и указать в своем запросе, с чем сопоставлять.

Вероятно, немного больше работы, чем другие предложения, но вы можете использовать сборку в другом месте, если вам это нужно.

0 голосов
/ 02 июня 2011

Вы можете использовать строковые функции SQL-сервера:

# Currency
SELECT SUBSTRING(<value>, 1, CHARINDEX(' ', <value>))

# Amount
SELECT SUBSTRING(<value>, CHARINDEX(' ', <value>), LEN(<value>))
0 голосов
/ 02 июня 2011

Я бы использовал Perl для этого ...

#!/usr/bin/perl
use strict;
use warnings;

open(FH,"<data.txt");

my @lines=<FH>;

print "Currency"."\t"."Cost\n";

foreach my $line (@lines){
    $line=~s/\n//g;
    if($line ne ""){
        my @split1=split(/\s+/,$line);
        if($split1[0]=~m/[0-9.]/){
            print "\t".$split1[0]."\n";
        }else{
            print $split1[0]."\t".$split1[1]."\n";
        }
    }
}
...