web-dev-qa-db-ja.com

アルファベット以外の文字で始まる値をテーブルの列にクエリする方法は?

アルファベット以外の文字(スペースとアンダースコアを含むすべての「特殊」文字)で始まる行を選択するにはどうすればよいですか?

何か変更されるかどうかはわかりませんが、my_tableにはギリシャ文字で始まる値も含まれます。

$query = $db->getQuery(true);
$query->clear();
$query
    ->select(array('id', 'last_name', 'first_name'))
    ->from($db->qn('#__my_table'))
    ->where($db->qn('last_name').' LIKE '. $db->q('[^a-zA-Z%]'))
    ->order('last_name, first_name ASC')
    ->setLimit($startrow, '100');
$db->setQuery($query);

クエリフォームは正しく、次のように設定すると正しい結果が返されます:$ db-> q( 'A%')だから、私の間違いは正規表現にあるはずですが、表示されませんどこ?

質問後に編集

このようなレターメニューを作成しようとしていますA B C D ...ΑΒΓΔ...#。文字をクリックすると、#をクリックすると、その文字から始まるすべての姓が表示されます。他のすべての「姓」が返されます(ユーザーは姓をインポートするため、特殊文字、数字、スペース、アンダースコアを使用できます)。

このコードは#をクリックするためのものなので、英語で始まるすべての姓とギリシャ文字で始まるすべての姓を除外する必要があります。他に必要なものを分類する方法がある場合は、アドバイスをお願いします。

私はNOT REGEXP '。$ db-> q(' [A-Za-z%] '))(以下の更新されたコード)を検出しましたが、ほとんどのジョブを実行しますが、フィルタリングしませんギリシャ文字。

$query = $db->getQuery(true);
    $query->clear();
    $query
        ->select(array('id', 'last_name', 'first_name'))
        ->from($db->qn('#__my_table'))
        ->where($db->qn('last_name').' NOT REGEXP '. $db->q('[A-Za-zα-ωΑ-Ω%]'))
        ->order('last_name, first_name ASC')
        ->setLimit($startrow, '100');
    $db->setQuery($query);

[〜#〜]解決済み[〜#〜]

正しい正規表現を見つけることができました

$query = $db->getQuery(true);
$query->clear();
$query
    ->select(array('id', 'last_name', 'first_name'))
    ->from($db->qn('#__my_table'))
    ->where($db->qn('last_name').' NOT REGEXP '. $db->q('^[a-z|α-ω]'))
    ->order('last_name, first_name ASC')
    ->setLimit($startrow, '100');
$db->setQuery($query);
1
John

まず、実際にwhere句が必要ですか?名前を本当に除外しようとしていますか?あなたが望む実際の除外は何ですか?

名前をフィルタリングするつもりがない場合は、クエリのWHERE句を削除して、すべてのユーザー/ユーザー名を含めることができます。

次に、そのような正規表現をLIKEで渡すことはできません。上記のクエリでは何も返されません。これは、WHEREが[^a-zA-Z]で始まる名前を検索しているため、その後に任意の名前を付けることができるためです。

対照的に、LIKE 'A%'は、Aで始まり、その後に何かがあるすべての名前を検索しています。

正規表現を行う必要がある場合、MySQLはREGEXPNOT REGEXPRLIKEを提供します。

MySQLドキュメント:

フィルタしようとしているのは少しあいまいです...名前は数字で始まるのですか、それとも何ですか?

もしそうなら、これはそれらを除外するための正規表現を使用したサンプルMySQLクエリです:

$query
    ->select(array('id', 'username'))
    ->from($db->qn('#__users'))
    ->where($db->qn('username').' NOT REGEXP '. $db->q('^[0-9]'))
    ->order('username ASC')
    ->setLimit($startrow, '100');
1
FFrewin

質問に編集されたOPのソリューションを改良したいと思います。研究者が何が起こっているのかを比較して理解できるようにします。

_$query = $db->getQuery(true)
    ->select($db->qn(["id", "last_name", "first_name"])
    ->from($db->qn("#__my_table"))
    ->where($db->qn("last_name") . " REGEXP " . $db->q("^[^a-zα-ω]"))
    ->order($db->qn(["last_name", "first_name"]))
    ->setLimit((int)$limit, (int)$offset);
$db->setQuery($query);
_
  • clear()が必要であることを知らないので、削除します。
  • Joomla標準が要求する不要なqn()呼び出しをすべて追加しました。
  • 正規表現ロジックは、2つの範囲の文字で始まらない行を探します。 "否定された文字クラスを書くには、_^_の直後に_[_を使用します。文字クラス内では、パイプを使用して文字範囲を分離せず、並べて配置します。
  • 否定された文字クラスを使用することにより、NOTREGEXPの前から削除できます。
  • デフォルトのソート方向はASCであるため、クエリからその宣言を省略できます。
  • 開始パラメータと制限パラメータが逆になっています。制限はオフセットの前に来る必要があります。 https://api.joomla.org/cms-3/classes/JDatabaseQueryLimitable.html#method_setLimit
0
mickmackusa