PostgreSQL模仿Oracle的instr函数

时间:2023-03-09 02:54:18
PostgreSQL模仿Oracle的instr函数
  1. --
  2. -- instr functions that mimic Oracle's counterpart
  3. -- Syntax: instr(string1, string2, [n], [m]) where [] denotes optional parameters.
  4. --
  5. -- Searches string1 beginning at the nth character for the mth occurrence
  6. -- of string2.  If n is negative, search backwards.  If m is not passed,
  7. -- assume 1 (search starts at first character).
  8. --
  9. CREATE FUNCTION instr(varchar, varchar) RETURNS integer AS $$
  10. DECLARE
  11. pos integer;
  12. BEGIN
  13. pos:= instr($1, $2, 1);
  14. RETURN pos;
  15. END;
  16. $$ LANGUAGE plpgsql STRICT IMMUTABLE;
  17. CREATE FUNCTION instr(string varchar, string_to_search varchar, beg_index integer)
  18. RETURNS integer AS $$
  19. DECLARE
  20. pos integer NOT NULL DEFAULT 0;
  21. temp_str varchar;
  22. beg integer;
  23. length integer;
  24. ss_length integer;
  25. BEGIN
  26. IF beg_index > 0 THEN
  27. temp_str := substring(string FROM beg_index);
  28. pos := position(string_to_search IN temp_str);
  29. IF pos = 0 THEN
  30. RETURN 0;
  31. ELSE
  32. RETURN pos + beg_index - 1;
  33. END IF;
  34. ELSE
  35. ss_length := char_length(string_to_search);
  36. length := char_length(string);
  37. beg := length + beg_index - ss_length + 2;
  38. WHILE beg > 0 LOOP
  39. temp_str := substring(string FROM beg FOR ss_length);
  40. pos := position(string_to_search IN temp_str);
  41. IF pos > 0 THEN
  42. RETURN beg;
  43. END IF;
  44. beg := beg - 1;
  45. END LOOP;
  46. RETURN 0;
  47. END IF;
  48. END;
  49. $$ LANGUAGE plpgsql STRICT IMMUTABLE;
  50. CREATE FUNCTION instr(string varchar, string_to_search varchar,
  51. beg_index integer, occur_index integer)
  52. RETURNS integer AS $$
  53. DECLARE
  54. pos integer NOT NULL DEFAULT 0;
  55. occur_number integer NOT NULL DEFAULT 0;
  56. temp_str varchar;
  57. beg integer;
  58. i integer;
  59. length integer;
  60. ss_length integer;
  61. BEGIN
  62. IF beg_index > 0 THEN
  63. beg := beg_index;
  64. temp_str := substring(string FROM beg_index);
  65. FOR i IN 1..occur_index LOOP
  66. pos := position(string_to_search IN temp_str);
  67. IF i = 1 THEN
  68. beg := beg + pos - 1;
  69. ELSE
  70. beg := beg + pos;
  71. END IF;
  72. temp_str := substring(string FROM beg + 1);
  73. END LOOP;
  74. IF pos = 0 THEN
  75. RETURN 0;
  76. ELSE
  77. RETURN beg;
  78. END IF;
  79. ELSE
  80. ss_length := char_length(string_to_search);
  81. length := char_length(string);
  82. beg := length + beg_index - ss_length + 2;
  83. WHILE beg > 0 LOOP
  84. temp_str := substring(string FROM beg FOR ss_length);
  85. pos := position(string_to_search IN temp_str);
  86. IF pos > 0 THEN
  87. occur_number := occur_number + 1;
  88. IF occur_number = occur_index THEN
  89. RETURN beg;
  90. END IF;
  91. END IF;
  92. beg := beg - 1;
  93. END LOOP;
  94. RETURN 0;
  95. END IF;
  96. END;
  97. $$ LANGUAGE plpgsql STRICT IMMUTABLE;