I've fixed it by manually giving field names. However it returns empty.

WITH RECURSIVE "pattern" ( "pattern" ) AS (
SELECT
string_to_array( 'folder_2/SUB iso', '/' )),
"full_paths" AS (
SELECT
"id",
"base_folder_id",
"subject",
1 AS "idx" 
FROM
"folders"
CROSS JOIN "pattern" 
WHERE
((
"user_id" = 24 
) 
AND ( "subject" ILIKE "pattern" [ 1 ] )) UNION ALL
(
SELECT
"x"."id",
"x"."base_folder_id",
"x"."subject",
( "idx" + 1 ) 
FROM
"folders" AS "x"
CROSS JOIN "pattern"
INNER JOIN "full_paths" AS "y" ON ((
"y"."id" = "y"."base_folder_id" 
) 
AND ( "x"."subject" ILIKE "pattern" [ ( "idx" + 1 ) ] )))) SELECT
"id",
"subject" 
FROM
"full_paths"
CROSS JOIN "pattern" 
WHERE
(
"idx" = CARDINALITY ( "pattern" ))





On Thursday, October 11, 2018 at 10:49:55 PM UTC+3, genc wrote:
>
> Hi Jeremy,
>
> Thank you so much!!!
>
>
> However, Unfortunately given example produces an error and says:
>
>
> > ERROR:  column pattern.base_folder_id does not exist
>
>   LINE 1: ...n" INNER JOIN "full_paths" AS "y" ON (("y"."id" = "pattern
> "....
>                                                                
>
> I think In your query, :pattern matched with :y instead of :x with :y when 
> inner join created. I tried to manually fix it but unable to do so.
>
> Thanks,
> Gencer.
>
>
>
> On Thursday, October 11, 2018 at 10:34:12 PM UTC+3, Jeremy Evans wrote:
>>
>> On Thursday, October 11, 2018 at 11:31:06 AM UTC-7, genc wrote:
>>>
>>> Hi,
>>>
>>> I'm sorry my previous email was mistakenly wrong. This is the correct 
>>> one. I mixed up the queries.
>>>
>>>
>>> with recursive pattern(pattern) as (
>>>  select string_to_array('folder_2/SUB iso', '/') -- input
>>> ),
>>> full_paths as (
>>>  select id, base_folder_id, subject, 1 as idx
>>>  from folders
>>>  cross join pattern
>>>  where user_id = 24 and subject ILIKE pattern[1]
>>> union all
>>>  select x.id, x.base_folder_id, x.subject, idx+ 1
>>>  from folders as x
>>>  cross join pattern
>>>  inner join full_paths as y 
>>>  on x.base_folder_id = y.id 
>>>  and x.subject ILIKE pattern[idx+ 1]
>>> )
>>> select id, subject
>>> from full_paths
>>> cross join pattern
>>> where idx = cardinality(pattern)
>>>
>>>
>>> I couldn't transform this to Sequel properly. Is there any way to do 
>>> this or should do a function?
>>>
>>
>> You can do this with Sequel:
>>
>>  DB[:full_paths].
>>   select(:id, :subject).
>>   cross_join(:pattern).
>>   where{{:idx=>cardinality(:pattern)}}.
>>   with(:pattern, DB.select{string_to_array("folder_2/SUB iso", '/')}, 
>> :args=>[:pattern]).
>>   with_recursive(:full_paths,
>>     DB[:folders].
>>       select(:id, :base_folder_id, :subject, Sequel[1].as(:idx)).
>>       cross_join(:pattern).
>>       where(:user_id=>24).
>>       where{subject.ilike(pattern.sql_subscript(1))},
>>     DB[Sequel[:folders].as(:x)].
>>       select(:id, :base_folder_id, :subject, Sequel[:idx] + 1).
>>       cross_join(:pattern).
>>       join(Sequel[:full_paths].as(:y), 
>> :id=>:base_folder_id){Sequel.expr{x[:subject].ilike(pattern.sql_subscript(idx+1))}}
>>   )
>>
>> WITH RECURSIVE "pattern"("pattern") AS (
>>   SELECT string_to_array('folder_2/SUB iso', '/')
>> ),
>> "full_paths" AS (
>>  SELECT "id", "base_folder_id", "subject", 1 AS "idx"
>>  FROM "folders"
>>  CROSS JOIN "pattern"
>>  WHERE (("user_id" = 24) AND ("subject" ILIKE "pattern"[1] ESCAPE '\'))
>> UNION ALL (
>>   SELECT "id", "base_folder_id", "subject", ("idx" + 1)
>>   FROM "folders" AS "x"
>>   CROSS JOIN "pattern"
>>   INNER JOIN "full_paths" AS "y"
>>   ON (("y"."id" = "pattern"."base_folder_id")
>>   AND ("x"."subject" ILIKE "pattern"[("idx" + 1)] ESCAPE '\')))
>> )
>> SELECT "id", "subject"
>> FROM "full_paths"
>> CROSS JOIN "pattern"
>> WHERE ("idx" = cardinality("pattern"))
>>
>> Thanks,
>> Jeremy
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sequel-talk+unsubscr...@googlegroups.com.
To post to this group, send email to sequel-talk@googlegroups.com.
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to