2011-08-08 3 views
8

結果が「[email protected]」で、@シンボル(3)の位置を検索したい場合。出来ますか? SQLiteにINSTRLOCATEPOSITIONまたはそのような関数があるとは思われません。SQLiteカラムの文字の位置はどうやって確認できますか?

SELECT ?('[email protected]') 

更新私は、カスタム拡張機能を登録してしまったが、私が持っていたことに驚きました。

+1

あなたの解決策を共有してください。 – Odys

答えて

-1
SELECT 
    email, 
    POSITION('@' IN email) 
From 
    table 

ここであなたが好きかもしれない基本的なリソースです:文字のhttp://sqlzoo.net/howto/source/z.dir/tip238311/sqlite

+0

こんにちは、クール。私はカスタムエクステンションを構築しましたが、私のSQLiteビルドではPOSITIONは利用できません。それはあなたの作品ですか? – tofutim

+0

SQL構文エラーが発生する可能性があります。SELECT email、POSITION(['IN'電子メール)FROM table [テーブルの近く]:構文エラー] 例外名:NS_ERROR_FAILURE – tofutim

+1

私はsqlliteには大きくはありませんが、あなたが(私が思う)sqlliteがそれらを特殊文字として扱うので、ブラケットがあなたに問題を起こしているかもしれません。一重引用符ではなく二重引用符で囲んでください。多分それがそうします。 – Chains

-7

ポジション '@' 関数CHARINDEX(MSSQL)によってfindedすることができます。

SELECT CHARINDEX('@', '[email protected]', 0) 
+3

私は人々が答える前に質問を読むことを望みます、CHARINDEXはSQLiteに実装されていません!! – ilomambo

0

使用charindex('c', column, 0)

それSQLiteのバージョンによって異なります。

+0

これはsqliteではなくsqlサーバの機能です –

2

a spiceworks postingからこれを手に入れた:

The first step is to remove all characters up to a specific character using ltrim or rtrim. If you're retrieving a filename then you trim all characters that are not slashes. If you're retrieving a username then you trim everything that is not an @ character. You can then use that trimmed string in a replace function to replace its occurrence with an empty string. That will provide you with every character that you just trimmed in the first step. In other words, the username or filename.

create table example (path varchar(256), email varchar(128)); 

insert into example values ('/path/to/file1.txt', '[email protected]'); 

Retrieve user from email:

select replace(email, ltrim(email, '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!#$%^&*()_+-=`~[]\/{}|;:,.<>?'),'') from example; 
2

をあなたがhereを見ることができるように、CHARINDEXは(少なくとも私が使用して3.6.2のバージョンで)SQLiteの標準パッケージではありません。しかし、this拡張子(extension-functions.c)にはCharindexがあります。これは基本的にVB instrと同じです。 sqliteのにこれらの機能を追加するには

我々はSQLite拡張モジュール(Windowsであると仮定)を作るためにCのソースコードをコンパイルする必要があります。

  • 小さなmingwコンパイラをインストールし、簡単に行うことができます。

  • 同じフォルダにコピーsqlite3.h

  • gccの-fPIC -lm -shared延長-functions.c -o libsqlitefunctions.dll

  • fireup sqliteの

  • 選択load_extension( 'libsqlitefunctions.dll')

その他の文字列関数と数学関数もあります。

+0

私は[extension-functions.c](http://www.sqlite.org/contrib/download/extension)をコンパイルしていたフォルダにsqlite3ext.hをコピーしなければなりませんでした。 -functions.c?get = 25) cygwin x64インストールからgcc-4.8.3で正常にコンパイルされました。ありがとう! –

10

パスからファイル名を取得します。http://community.spiceworks.com/topic/38836-sqlite-question-how-do-i-find-the-position-of-a-character-in-a-string?page=2から

select replace(path, rtrim(path, replace(path, '/', '')), '') from example; 

ガットは、それが誰かを助けることができる願っています。

+0

これは、バージョン3.7.15で追加された 'instr'関数なしでこれを行う方法を説明しています。 – Fenikso

+0

スマートな代替方法 – Plugie

6

これが最近追加されたかどうかわかりませんが、INSTR functionが実際に第1のインスタンスを検出します。

+2

質問が投稿された後にリリースされた3.7.15に追加されました。 http://www.sqlite.org/changes.html#version_3_7_15 – laalto

+0

合意:それにもかかわらず、これは現在、グーグルドインしている人にとって正解ですね。 – mediaczar

+1

はい、そうです。検索で私がここに到着したのと同じように –

関連する問題