ACCESSのクエリでの質問です。


テーブルA
フィールド1

d
支払い
pc文字
a箱

上記のテーブルのように、一つのフィールドに文字列がいくつか入っているのですが、
その内複数の不要な文字列をクエリで表示しないようにしたいです。
下記のような結果を出すにはどうしたら良いでしょうか。

テーブルA
フィールド1

文字

回答の条件
  • 1人5回まで
  • 登録:2008/06/12 11:18:41
  • 終了:2008/06/19 11:20:03

回答(2件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012008/06/12 18:28:07

ポイント35pt

「不要な文字列の個数」と「Accessのバージョン」の組み合わせによっては

replace関数を入れ子にするという手も使えるかと思いますが

私なら自作関数との組み合わせにします。

関数

Function MyReplace(t As String) As String
  t = Replace(t, "d", "")
  t = Replace(t, "支払い", "")
  t = Replace(t, "pc", "")
  t = Replace(t, "a", "")
  MyReplace = t
End Function

クエリ

SELECT F2
FROM (
  SELECT MyReplace(F1) as F2 FROM テーブルA
)
WHERE F2 <> "";
id:rupopon

ありがとうございました。使ってみます。

2008/06/13 00:59:23
id:kaiton No.2

kaiton回答回数260ベストアンサー獲得回数342008/06/13 10:25:31

ポイント35pt

テーブル名とフィールド名は置き換えていますが.. Replace関数では

SELECT Replace(Table_1!F11,Table_2!F21,"") AS F21
FROM Table_1, Table_2
WHERE (((Table_1.F11) Like "*" & Table_2.F21 & "*"));

けれど、置き換えする文字がないレコードが消えるんですよね?

その質問をするのを忘れましたが...

 そのようなレコードはないのか?

 あっても不要なのか?

 そのようなレコードも必要

SELECT Replace(Table_1!F11,Table_2!F21,"") AS F21
FROM Table_1, Table_2
WHERE (((Table_1.F11) Like "*" & Table_2.F21 & "*"))
UNION All
SELECT Replace(Table_1!F11,Table_2!F21,"") AS F21
FROM Table_1, Table_2
GROUP BY Replace(Table_1!F11,Table_2!F21,"")
HAVING (((Count(Table_1.F11))=(SELECT COUNT(*) FROM Table_2)));

でいけましたが.. もっと良い方法があるかもしれません。

バージョン2003で確認しています。

id:rupopon

ありがとうございました。置き換えする文字がないレコードも必要です。

2008/06/16 09:16:08
  • id:kn1967
    >不要な文字列をクエリで表示しないようにしたい

    d  アルファベットだけだから非表示
    支払い 日本語だけだから非表示
    pc文字 先頭がアルファベットで日本語が続くのでアルファベットだけを非表示
    a箱  上に同じ

    といったような事かしら?
    具体的に書かないと、サンプルではとりあえず動いても
    本当に貴殿が行いたい事が出来ているとは限らないわよん♪
  • id:rupopon
    わかりづらくてすみません。
    そうではなくて任意の文字列をいくつか指定して
    非表示にしたいということです。
    文字列の場所はサンプルのようにバラバラ
    サンプルでいくと不要な文字列は"d","支払い","pc","a"になります。
    よろしくお願いします。
  • id:kaiton
    3点ほど確認です。
    "pc支払い"といったような不要な文字が1レコードの1フィールドに2個あることはあるのですか、その場合の扱いは?
    テーブルAはフィールド1以外に一意のキーになるようなフィールドはありませんか?
    不要な文字列を除いて空白になったレコードの扱いは?
  • id:rupopon
    コメントありがとうございます。
    不要な文字は1レコードの1フィールドに1個です。
    テーブルAに一意のキーになるようなフィールドはないです。
    不要な文字列を除いて空白になったレコードの扱いは空白のままがいいです。
    よろしくお願いいたします。
  • id:kn1967
    >空白になったレコードの扱いは空白のままがいい

    空白レコードを除外するためにサブクエリを用いていますが
    空白のまま残しても良いのならばクエリは
      SELECT MyReplace(F1) as F2 FROM テーブルA
    の1行だけになります。

    >空白になったレコードの扱いは空白のままがいい
    >不要な文字は1レコードの1フィールドに1個です。

    この2つが揃うならば
    テーブルBを用意
      d
      支払い
      pc
      a
    関数を用意
      Function MyReplace2(t1 As String, t2 As String) As String
        MyReplace2 = Replace(t1, t2, "")
      End Function
    クエリを用意
      SELECT MyReplace2(テーブルA.F1,テーブルB.F1) AS F2
      FROM テーブルA, テーブルB
      WHERE テーブルA.F1 LIKE "*" & テーブルB.F1 & "*";
    Accessのバージョンによっては自作関数を用意しなくても
    クエリ内でAccess標準のreplace関数が使えるはず。
  • id:kaiton
    テーブル名とフィールド名は置き換えていますが.. Replace関数では
    SELECT Replace(Table_1!F11,Table_2!F21,"") AS F21
    FROM Table_1, Table_2
    WHERE (((Table_1.F11) Like "*" & Table_2.F21 & "*"));

    けれど、置き換えする文字がないレコードが消えるんですよね?
    その質問をするのを忘れましたが...
     そのようなレコードはないのか?
     あっても不要なのか?
     そのようなレコードも必要

    SELECT Replace(Table_1!F11,Table_2!F21,"") AS F21
    FROM Table_1, Table_2
    WHERE (((Table_1.F11) Like "*" & Table_2.F21 & "*"))
    UNION All
    SELECT Replace(Table_1!F11,Table_2!F21,"") AS F21
    FROM Table_1, Table_2
    GROUP BY Replace(Table_1!F11,Table_2!F21,"")
    HAVING (((Count(Table_1.F11))=(SELECT COUNT(*) FROM Table_2)));
    でいけましたが.. もっと良い方法があるかもしれません。

    この内容で回答しています。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません