2014-10-04 3 views
0

Я хотел бы определить право собственности на папку. Поэтому каждая папка имеет постоянное соглашение об именах, которое хранится в таблице OWNER (ident_string). Использование ident_string Я хочу определить owner_id и записать его (update) в таблицу FOLDER (owner_id).SQL - Динамический поиск с регулярным выражением

я следующие таблицы в Postgresql:

create table owner(
    owner_id serial PRIMARY KEY, 
    owner_name varchar(100), 
    ident_string varchar(100)); 

create table folder(
folder_id serial PRIMARY KEY, 
folder_name varchar(80), 
folder_path varchar(800), 
owner_id integer references owner(owner_id)); 

insert into owner (owner_name, ident_string) values ('Jonny English','b-jonny'); 
insert into owner (owner_name, ident_string) values ('Hanna Babara','b-hanna'); 
insert into owner (owner_name, ident_string) values ('Mary Marmelade','b-mary'); 

insert into folder (folder_name,folder_path) values ('b-jonny-20130101','/archive/backup/b-jonny-20130101'); 
insert into folder (folder_name,folder_path) values ('b-jonny-20130103','/archive/backup/b-jonny-20130103'); 
insert into folder (folder_name,folder_path) values ('b-hanna-20140101','/archive/backup/b-jonny-20140101'); 
insert into folder (folder_name,folder_path) values ('b-mary-20120303','/archive/backup/b-mary-20120303'); 

Я думаю, что единственный Possiblity сделать это с помощью PL/PgSQL:

  • итерации для имя_папки в ПАПКАХ над каждой строкой в ​​ВЛАДЕЛЬЦЕ
  • проверить для каждого ident_string для поиска owner_id.

Может ли кто-нибудь помочь мне?

ответ

1

Попробуйте это:

update folder as f 
    set owner_id = o.owner_id 
    from owner as o 
where o.ident_string = left(f.folder_name,length(o.ident_string)); 

-g

+0

Прохладный! Хорошее решение! – royskatt

2

Возможно, что-то похожее на следующее?

update folder set folder.owner_id = owner.owner_id from folder join owner on folder_name like owner.ident_string + '%'

(как это метод regexs в SQL)

+0

Хм, я не уверен, как это будет работать: я как-то нужно, чтобы соответствовать folder.folder_name с «% owner.ident_string%», чтобы получить owner.ownerid из согласованного ряда и курица обновляет соответствующую строку в папке.owner_id .. – royskatt

+0

Gotcha - только что обновил ее. Это помогает? – Drew

+0

Спасибо за решение, на самом деле это то, о чем я просил. Ну, что быстрее? Я не знаю, проверит. – royskatt

1

Вы можете создать таблицу folder в одном предложении:

insert into folder (folder_name,folder_path,owner_id) 
with tmp (folder_name,folder_path) as 
(
select 'b-jonny-20130101','/archive/backup/b-jonny-20130101' union all 
select 'b-jonny-20130103','/archive/backup/b-jonny-20130103' union all 
select 'b-hanna-20140101','/archive/backup/b-jonny-20140101' union all 
select 'b-mary-20120303','/archive/backup/b-mary-20120303' 
) 
select folder_name,folder_path,o.owner_id 
    from tmp 
    join owner o 
    on tmp.folder_name ~ o.ident_string; 
select * from owner; 

Используйте регулярное выражение (~), оно более мощное.

См SQL FIDDLE DEMO

Смежные вопросы