Извлекать числовые и специальные символы отдельно

#sql #sql-server #tsql #string #string-parsing

#sql #sql-сервер #tsql #строка #синтаксический анализ строк

Вопрос:

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

 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   
  

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

Ответ №1:

 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
  

Комментарии:

1. Вероятно, вы хотите добавить регистр для преобразования no currrency в ‘RS’

2. Я следил за вашими ответами в течение последней недели. Действительно полезно. Хотелось бы узнать от вас намного больше.

Ответ №2:

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

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

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

my @lines=<FH>;

print "Currency"."t"."Costn";

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";
        }
    }
}
  

Ответ №3:

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

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

# Amount
SELECT SUBSTRING(<value>, CHARINDEX(' ', <value>), LEN(<value>))
  

Ответ №4:

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

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

Ответ №5:

 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
  

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

Ответ №6:

Строковый буфер alpha = новый строковый буфер (), num = новый строковый буфер (), special = новый строковый буфер ();

                     final String txt= txtview2.getText().toString();
                    alpha1.setText(txtview2.getText().toString());
                    num1.setText(txtview2.getText().toString());
                    special1.setText(txtview2.getText().toString());


                    Toast.makeText(MainActivity.this,"you enter string:" txt,Toast.LENGTH_SHORT).show();
                    for (int i=0; i<txt.length(); i  )
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   {
                        if (Character.isDigit(txt.charAt(i)))
                            num.append(txt.charAt(i));
                        else if(Character.isLetter(txt.charAt(i)))
                            alpha.append(txt.charAt(i));
                        else
                            special.append(txt.charAt(i));
                    }

                    alpha1.setText("The Character: "  alpha);
                    num1.setText("The digit:"   num);
                    special1.setText("The special symbol: "   special);
                }